题解 | #分糖果问题#
分糖果问题
https://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352
1.贪心
思路:
要想分出最少的糖果,利用贪心思想,肯定是相邻位置没有增加的情况下,大家都分到1,相邻位置有增加的情况下,分到糖果数加1就好。什么情况下会增加糖果,相邻位置有得分差异,可能是递增可能是递减,如果是递增的话,糖果依次加1,如果是递减糖果依次减1?这不符合最小,因为减到最后一个递减的位置可能不是1,必须从1开始加才是最小,那我们可以从最后一个递减的位置往前反向加1.
具体做法:
- 把所有孩子的糖果数初始化为 1;
- 先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的 糖果数加 1;否则保持1不变
- 再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。
- 通过这两次遍历, 分配的糖果就可以满足题目要求了。
#include <numeric>
#include <vector>
class Solution {
public:
/**
* pick candy
* @param arr int整型vector the array
* @return int整型
*/
int candy(vector<int>& arr) {
// write code here
int n = arr.size();
vector<int> res(n,1);
//从左到右遍历
for(int i = 1;i<n;++i)
{
//如果右边在递增,糖果数为左边的糖果数+1
if(arr[i] > arr[i-1])
res[i] = res[i-1]+1;
}
//从右到左遍历
for(int i = n-2;i>=0;--i)
{
//如果左边更大但是糖果数更小,更新为右边的糖果数+1
if(arr[i] > arr[i+1] && res[i] <= res[i+1] )
{
res[i] = res[i+1]+1;
}
}
int sum = accumulate(res.begin(),res.end(),0);
return sum;
}
};