思路:参照了网上讨论的结果,采用一个时间复杂度为O(n)的解法,把序列看成一个波形图,波谷位置一定是1,分两次扫描,第一次扫描的时候从左至右,碰到上升序列,candy数目依次相加,如果是下降趋势,先不管,等第二次扫描的时候再来求解。
code:
class Solution {
public:
int candy(vector<int> &ratings) {
int N = ratings.size();
int *candy = new int[N];
fill(candy,candy+N,1);
int original = 2;
for(int i = 0;i < N-1;i++)
if(ratings[i+1] > ratings[i])
candy[i+1] = max(original++,candy[i+1]);
else
original = 2;
original = 2;
for(int i = N-1;i >= 1;i--)
if(ratings[i-1] > ratings[i])
candy[i-1] = max(original++,candy[i-1]);
else
original = 2;
int ret = 0;
for(int i = 0;i<N;i++)
ret += candy[i];
return ret;
}
};