135 分发糖果
题目
解题思路
- 按照题意,相邻俩个孩子分数高得到更多糖果,但是为了使得满足最少糖果数,就需要从左右俩个方向考虑,如果同时考虑俩边一定会顾此失彼。
- 那么可以先考虑从左往右,在考虑从右往左
- 局部最优:只要右边孩子评分比左边高,右边孩子就多一个糖果
- 全局最优:相邻孩子中,评分高的右孩子获得比左边孩子更多糖果
- 从左往右,只比较右孩子比左孩子评分高情况;从右往左,只比较左孩子比右孩子评分高的情况
具体代码
public int candy(int[] ratings) {
int len = ratings.length;
// 记录糖果分发情况
int[] candyVec = new int[len];
candyVec[0] = 1;
// 从左往右,右边孩子评分比左边高,右边孩子就多一个糖果
for (int i = 1; i < len; i++) {
candyVec[i] = (ratings[i] > ratings[i - 1]) ? candyVec[i - 1] + 1 : 1;
}
// 从右往左,只比较左孩子比右孩子评分高的情况
for (int i = len - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candyVec[i] = Math.max(candyVec[i], candyVec[i + 1] + 1);
}
}
int ans = 0;
for (int num : candyVec) {
ans += num;
}
return ans;
}