LeetCode 135. 分发糖果【贪心】

题目描述

一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一 个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果。

解题思路

  • 把所有孩子的糖果数初始化为 1; 先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的 糖果数加1;

  • 再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数 不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加1。

  • 通过这两次遍历, 分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一 侧的大小关系。

AC

class Solution {
public:
    int candy(vector<int>& ratings) {
        int size = ratings.size();
        if(size<2) return size;
        vector<int> v(size,1);
        //先从左到右遍历
        for(int i=0;i<size-1;i++){
            if(ratings[i+1]>ratings[i])
                v[i+1]=v[i]+1;
        }
        //再从右到左遍历
        for(int i=size-1;i>=1;i--){
            if(ratings[i-1]>ratings[i])
                v[i-1]=max(v[i-1],v[i]+1);
        }
        return accumulate(v.begin(),v.end(),0);
    }
};
学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 博客之星 前端开发攻城狮
掘金搜【一百个Chocolate】
座右铭:学如逆水行舟,不进则退!
公众号:小狮子前端 期待小狮子们的加入~
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值