可以使用贪心算法解决该问题 思路很简单
定义两个数组 Left 和 Right
Left 数组 从前向后 遍历使其满足条件
Right数组 从后向前 遍历使其满足条件
然后取left 和 right 第 i 位最大的值
total += max(left[i],right[i]);
累加total即可
这种思路清晰代码明了 还有其他方法
public int candy(int[] ratings) {
int total = 0;
int size = ratings.length;
int left[] = new int[size];
int right[] = new int[size];
left[0] = 1;
right[size - 1] = 1;
for (int i = 1; i < size; i++) {
if (ratings[i] > ratings[i - 1]) {
left[i] = left[i - 1] + 1;
} else {
left[i] = 1;
}
}
for (int i = size - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
right[i] = right[i + 1] + 1;
} else {
right[i] = 1;
}
}
for (int i = 0; i < size; i++) {
total += Math.max(left[i], right[i]);
}
return total;
}
这种思想比较难理解 我也是写的时候知道啥意思 写完了也比较蒙
这个排列有个特点 不管是升序 1 , 2 , 3 还是降序降序分发的糖果数量都是递增的
1,2,3 和 3,2,1这个分发的糖果数量是一样的。
我们分为两种情况处理 递增 和 递减
递增 : 递增比较清晰 ratings[i + 1] 大于 ratings[i] 就递增长度个糖果 相等算在了递增里 就相当于一个新的递增开始
递减 : rathings[i + 1] 小于 rathings[i] 就发放递减长度减一的糖果 如果递减长度大于了递增长度 就要对 i 及其后续递减 都要额外发放一个糖果
为什么 递减需要 发放 长度减一个,递增却发放 长度个?
因为 从递增到递减过度时 【1,2,1】 2 -> 1,2处在递增队列中 所发糖果数量一定递减队列所发糖果数量 所以递减队列就可以少发一个糖果
为什么 递减长度大于递增长度后 所有递减的都要额外多发放一个?
因为 当递减长度大于递增长度后就打破了 递增队列中 所发糖果数量一定递减队列所发糖果数量 这个约定 所以就要额外多发一个
这种解法很有意思 能看懂最好 看不到第一种绝对足够了,面试也不会要求写出这种的。
class Solution {
public int candy(int[] ratings) {
int pre = 1;
int ret = pre;
int decr = 0;
int incr = pre;
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] >= ratings[i - 1]) {
decr = 0;
pre = ratings[i] == ratings[i - 1] ? 1 : ++pre;
ret += pre;
incr = pre;
} else {
decr++;
if (decr == incr)
decr++;
ret += decr;
pre = 1;
}
}
return ret;
}
}