题解 | #分糖果问题#官方代码简单明了解释

分糖果问题

https://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352

相邻的个数有递增有递减,就好像一个折线图,我们其实可以看出折线图的最低点时一定的,一定时1,如果最低点练习几个相同那么就都是1,这是我们确定的,1.我们看递增的话可以从左往右,左边开始时第一个最低点,这个是确定的,就可以推导出递增的序列了。2,那么递减呢,递减的话下一个可不一定只比当前值少一个,少几个也是有可能的,没有办法推导,但是我们发现从从左往右是递减的,但是从右往左就是递增了,并且最右边最小值1开始推导,最后还要有一个矫正,完美了,这个递增的推导式完全正确且唯一的,我们就是利用了这一点。递增从1开始推导,确定且唯一,明白着一点那么答案就已经出来了。

class Solution {
  public:
    int candy(vector<int>& arr) {
        int n = arr.size();
        vector<int> dp(n, 1);
        for(int i=1;i<n;i++)
        {
            if(arr[i]>arr[i-1])
            dp[i]=dp[i-1]+1;
        }
        for(int i=n-2;i>=0;i--)
        {                         //第二个条件和重要的。
            if(arr[i]>arr[i+1] && dp[i]<=dp[i+1])
            {
                dp[i]=dp[i+1]+1;
            }
        }
        int sum=0;
        for(auto& e:dp)
        sum+=e;
        return sum;
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务