码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode 135. 分发糖果】贪心策略:一次循环仅考虑一侧大小关系

时间:2021-05-25 17:45:40      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:思路   一个   技术   fnr   out   list   eval   for   tin   

链接地址:【leetcode 135. 分发糖果】贪心策略:一次循环仅考虑一侧大小关系

解题思路:
贪心策略:两次相反方向遍历,且每次遍历只考虑一侧的大小关系

因为评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果,所以评分更高的孩子,是在评分低的孩子的基础上+1,即需要获得评分低的孩子的累加值,所以在遍历的时候就需要注意判断的方向,比如我写的时候,顺序遍历,因为是从左到右,所以判断大小时,就需要判断右侧是否大于左侧,便可获得左侧的累加值,即判断的方向与遍历的方向同向,简单来看就是 > 与从左到右,同方向

1,初始化,每个孩子分配一个糖果
2,第一次遍历,顺序遍历,判断右边是否大于左边,如果是,可获得左边的值累加+1的onevalue
3,第二次遍历,逆序遍历,判断右边是否大于左边,如果是,可获得左边的值累加+1的twovalue,此时需要twovalue与onevalue进行比较,取最大的,这样不会导致onevalue比twovalue大时,被twovalue替换。
4,累加糖果返回

技术图片

代码:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int num = ratings.size();
        if(num <2)
        {
            return num;
        }

        vector<int> rec(num, 1);     //记录糖果,每个孩子至少分配到 1 个糖果。

        //顺序遍历,从左到右
        for (int i = 1; i < num; ++i)
        {
            if (ratings[i] > ratings[i-1])
                rec[i] = rec[i-1] + 1;  //右边》左边时,总比左边+1,可获得左边的值累加+1
        }

        //逆序遍历,从右到左
        for (int i = num - 1; i > 0; --i)
        {
            if (ratings[i - 1] > ratings[i])
                rec[i-1]  = max(rec[i-1],rec[i] +1);  
        }

        return accumulate(rec.begin(), rec.end(), 0); //累计初始值为0
    }
};

   

如有不足之处,还望指正 [1]


  1. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ??

【leetcode 135. 分发糖果】贪心策略:一次循环仅考虑一侧大小关系

标签:思路   一个   技术   fnr   out   list   eval   for   tin   

原文地址:https://www.cnblogs.com/CoutCodes/p/14806125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!