(动态规划)最小分糖果问题

  • 题目:
    有N个孩子站在一排。 每个孩子被分配一个评分值。
    
    你给这些孩子的糖果满足以下要求:
    
         每个孩子必须有至少一个糖果。
         评分较高的孩子比他们的邻居获得更多的糖果。
    
    你必须给的最低糖果是什么?

     



  • 题目分析:这个题目其实就是简单的遍历问题。一个打乱的数组,每个数字都有一个特定的属性值,相邻两个数字大的数字比小的数字的属性值大。我们可以一次遍历 搞定,不过有点繁琐;这里我先从左边一次遍历处理大的值,然后右边遍历一次处理大的值(类似处理小的值),这样比较清晰。
  • 代码:
    class Solution {
    public:
        int candy(vector<int> &ratings) {
            int len = ratings.size();
            if (len == 1)
                return 1;
            //从左边遍历   升序  找到大的就加1
            vector<int> res(len, 1);
            int sum = 0;
            for (int i=0; i<len-1; i++){
                if (ratings[i+1] > ratings[i])
                    res[i+1] = res[i]+1;
            }
            //在从右边遍历 升序  找到大的  加1
            //两次遍历类似于一次遍历两次判断。这样比较清晰
            for (int j=len-1; j>0; j--){
                if (ratings[j-1] > ratings[j] && res[j-1]<=res[j])
                    res[j-1] = res[j]+1;
            }
            
            for (int i=0; i<len; i++){
                sum += res[i];
            }
            return sum;
        }
    };

     

转载于:https://www.cnblogs.com/Kobe10/p/6367045.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值