135. Candy

作者: Nautilus1 | 来源:发表于2017-10-31 15:34 被阅读0次

题目描述:N个孩子坐在一排,每个孩子分配一个等级值,按如下要求给每个孩子分糖:

  1. 每个孩子至少有一个
  2. 等级高的孩子比其左右孩子多

问最少需要多少糖

分析:一个方向的比较只能满足一边的大小要求,两次遍历分别从前到后和从后到前,最后加起来。时间复杂度O(n),空间O(n)。

代码

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> v(n);          //记录第 i 个孩子的最少增加糖的个数
        for (int i = 1, inc = 1; i < n; i ++)       //inc是加给糖的个数,最少当然是多给1个
        {
            if (ratings[i] > ratings[i - 1])
                v[i] = max(inc ++, v[i]);         //等级每增大一个下一个 inc 就要多加一个
            else 
                inc = 1;               //出现下降则重新置1
        }
        for (int i = n - 2, inc = 1; i >= 0; i --)
        {
            if (ratings[i] > ratings[i + 1])
                v[i] = max(inc ++, v[i]);
            else 
                inc = 1;
        }
        return accumulate(v.begin(), v.end(), n);            //accumulate有三个形参:前两个指定累加的范围,第三个是累加的初值。
    }
};

第二种写法:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        int i, result = 0;
        vector<int> count(n);      //记录每个孩子的糖数
        //每一个人至少一个糖果
        for(i = 0;i < n;i++)
            count[i] = 1;

        for(i = 1; i < n ; i++)
        {
            if(ratings[i] > ratings[i-1])
                count[i] = count[i-1] + 1;
        }
        for(i = n-2;i >= 0; i--)
        {
            if(ratings[i] > ratings[i+1] && count[i] <= count[i+1])
                count[i] = count[i+1] + 1;

        }
        //统计糖果数量
        for(i = 0;i < n;i++)
            result += count[i];
        return result;
    }
};

相关文章

  • 135. Candy [Hard] DP

    135. Candy

  • 经典算法题:分发糖果

    135. 分发糖果[https://leetcode.cn/problems/candy/] 难度:困难 n 个孩...

  • 135. Candy

    题目 思路 dp[i]:记录i的获取糖果树 从左向右扫描,保证一个方向上分数更大的糖果更多 从右向左扫描,保证另一...

  • 135. Candy

    题目分析 There are N children standing in a line. Each child ...

  • 135. Candy

    There are N children standing in a line. Each child is as...

  • 135. Candy

    题目描述:N个孩子坐在一排,每个孩子分配一个等级值,按如下要求给每个孩子分糖: 每个孩子至少有一个 等级高的孩子比...

  • 135. Candy

    There are N children standing in a line. Each child is as...

  • 135. Candy

    问题分析 There are N children standing in a line. Each child ...

  • 135. Candy

    根据题意及贪心思想:评分高的学生必须获得更多的糖果 等价于 所有学生满足左规则且满足右规则

  • 135. Candy

    Ref: https://leetcode-cn.com/problems/candy/[https://leet...

网友评论

    本文标题:135. Candy

    本文链接:https://www.haomeiwen.com/subject/rpovpxtx.html