【leetcode 135. 分发糖果】贪心策略:一次循环仅考虑一侧大小关系
链接地址:【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]。
如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎