题解 | #分糖果问题#

分糖果问题

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;
    }
};
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务