Candy:对样例存在困惑的一道leetcode
2017-12-28 21:30
211 查看
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
Input:[1,2,2]
Output:5
Expected:4
这个样例让我接受不了,因为我觉得应该答案是 1,2,2为5的!!一样的相邻权重糖果数就应该一样的好吧!
思路其实就是左扫一遍右扫一遍,但是我真得觉得样例不合理。
这道题是这个:https://leetcode.com/problems/candy/description/
我不写答案了,我写的左扫一遍右扫一遍比较蠢,而且样例也让人觉得不爽。费劲两个小时,就得到个这个......
// 此题存在疑问?
public int candy(int[] ratings) {
int min = Integer.MAX_VALUE;
// 预处理,去除负数,使最小值为1
for (int i = 0; i < ratings.length; i++) {
if (ratings[i] < min)
min = ratings[i];
}
for (int i = 0; i < ratings.length; i++) {
ratings[i] = ratings[i] - min + 1;
}
// left to right
int[] l2r = new int[ratings.length];
for (int i = 0; i < ratings.length; i++) {
l2r[i] = ratings[i];
}
int same = 0;
for (int i = 0; i < ratings.length; i = i + same + 1) {
same = 0;
int l = (i == 0) ? Integer.MIN_VALUE / 2 : l2r[i - 1];
int r = (i == ratings.length - 1) ? Integer.MIN_VALUE / 2 : l2r[i + 1];
int m = l2r[i];
while (m == r) {
same++;
if (i + same + 1 > ratings.length - 1)
break;
r = l2r[i + 1 + same];
}
if (l < m && m < r) {
while (l < m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
} else if (l < m && m > r) {
while (l < m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
} else if (l > m && m > r) {
while (l > m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
} else if (l > m && m < r) {// 易错点!!{不能省略,否则{1,1}样例报错
while (l > m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
}
}
for (int i = 0; i < ratings.length; i++) {
System.out.print(l2r[i] + " ");
}
System.out.println();
// right to left
int[] r2l = new int[ratings.length];
for (int i = 0; i < ratings.length; i++) {
r2l[i] = l2r[i];
}
same = 0;
for (int i = ratings.length - 1; i >= 0; i = i - same - 1) {
same =
9c79
0;
int l = (i == 0) ? Integer.MIN_VALUE / 2 : r2l[i - 1];
int r = (i == ratings.length - 1) ? Integer.MIN_VALUE / 2 : r2l[i + 1];
int m = r2l[i];
// System.out.println("l: "+l+" m: "+m+" r: "+r);
while (m == l) {
same++;
if (i - same - 1 < 0)
break;
l = r2l[i - 1 - same];
}
if (l < m && m < r) {
while (l < m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
} else if (l < m && m > r) {
while (l < m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
} else if (l > m && m > r) {
while (l > m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
} else if (l > m && m < r) {// 易错点!!{不能省略,否则{1,1}样例报错
while (l > m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
}
}
for (int i = 0; i < ratings.length; i++) {
System.out.print(r2l[i] + " ");
}
System.out.println();
int res = 0;
for (int i = 0; i < ratings.length; i++) {
res += r2l[i];
}
return res;
}
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
Input:[1,2,2]
Output:5
Expected:4
这个样例让我接受不了,因为我觉得应该答案是 1,2,2为5的!!一样的相邻权重糖果数就应该一样的好吧!
思路其实就是左扫一遍右扫一遍,但是我真得觉得样例不合理。
这道题是这个:https://leetcode.com/problems/candy/description/
我不写答案了,我写的左扫一遍右扫一遍比较蠢,而且样例也让人觉得不爽。费劲两个小时,就得到个这个......
// 此题存在疑问?
public int candy(int[] ratings) {
int min = Integer.MAX_VALUE;
// 预处理,去除负数,使最小值为1
for (int i = 0; i < ratings.length; i++) {
if (ratings[i] < min)
min = ratings[i];
}
for (int i = 0; i < ratings.length; i++) {
ratings[i] = ratings[i] - min + 1;
}
// left to right
int[] l2r = new int[ratings.length];
for (int i = 0; i < ratings.length; i++) {
l2r[i] = ratings[i];
}
int same = 0;
for (int i = 0; i < ratings.length; i = i + same + 1) {
same = 0;
int l = (i == 0) ? Integer.MIN_VALUE / 2 : l2r[i - 1];
int r = (i == ratings.length - 1) ? Integer.MIN_VALUE / 2 : l2r[i + 1];
int m = l2r[i];
while (m == r) {
same++;
if (i + same + 1 > ratings.length - 1)
break;
r = l2r[i + 1 + same];
}
if (l < m && m < r) {
while (l < m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
} else if (l < m && m > r) {
while (l < m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
} else if (l > m && m > r) {
while (l > m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
} else if (l > m && m < r) {// 易错点!!{不能省略,否则{1,1}样例报错
while (l > m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j <= i + same; j++) {
l2r[j] = m;
}
}
}
for (int i = 0; i < ratings.length; i++) {
System.out.print(l2r[i] + " ");
}
System.out.println();
// right to left
int[] r2l = new int[ratings.length];
for (int i = 0; i < ratings.length; i++) {
r2l[i] = l2r[i];
}
same = 0;
for (int i = ratings.length - 1; i >= 0; i = i - same - 1) {
same =
9c79
0;
int l = (i == 0) ? Integer.MIN_VALUE / 2 : r2l[i - 1];
int r = (i == ratings.length - 1) ? Integer.MIN_VALUE / 2 : r2l[i + 1];
int m = r2l[i];
// System.out.println("l: "+l+" m: "+m+" r: "+r);
while (m == l) {
same++;
if (i - same - 1 < 0)
break;
l = r2l[i - 1 - same];
}
if (l < m && m < r) {
while (l < m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
} else if (l < m && m > r) {
while (l < m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
} else if (l > m && m > r) {
while (l > m && m > r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
} else if (l > m && m < r) {// 易错点!!{不能省略,否则{1,1}样例报错
while (l > m && m < r && m >= 1) {
m--;
}
m++;
for (int j = i; j >= i - same; j--) {
r2l[j] = m;
}
}
}
for (int i = 0; i < ratings.length; i++) {
System.out.print(r2l[i] + " ");
}
System.out.println();
int res = 0;
for (int i = 0; i < ratings.length; i++) {
res += r2l[i];
}
return res;
}
相关文章推荐
- 每天一道LeetCode-----计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少
- First Missing Positive:一道对测试样例十分困惑的题目
- 每天一道LeetCode-----存在一个由加油站组成的环路,判断是否可以从某个加油站出发环绕一周
- 每天一道LeetCode-----二叉树逐层遍历,每一层存在一个序列中,返回所有序列集合
- 【一天一道LeetCode】#349. Intersection of Two Arrays
- 6 Candy_Leetcode
- leetcode 240 查询一个排序好的矩阵中是否存在target
- 【一天一道LeetCode】#169. Majority Element
- 【一天一道LeetCode】#79. Word Search
- 【一天一道LeetCode】#232. Implement Queue using Stacks
- [LeetCode]题解(python):135-Candy
- 【一天一道LeetCode】#136. Single Number
- Leetcode 每日一道
- 【一天一道LeetCode】#86. Partition List
- 【leetcode】Candy
- LeetCode:Candy
- 【一天一道LeetCode】#225. Implement Stack using Queues
- 【一天一道LeetCode】#31. Next Permutation
- 【一天一道LeetCode】#91. Decode Ways
- Candy -- LeetCode