题解 | #分糖果问题#官方代码简单明了解释
分糖果问题
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; } };