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

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

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

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

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

图片.png

代码:

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. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎

posted @ 2021-05-24 20:47  CoutCodes  阅读(59)  评论(0编辑  收藏  举报