您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: