小朋友排在一排分糖果。每个小朋友至少有一个糖果,但是每个小朋友有个排名,排名高的小朋友比“邻居”的糖果要多。
问至少多少个糖果?
顺序模拟,假设第一个小朋友拿一个,如果后面的小朋友比他排名低,显然后面的小朋友拿后一个,前一个小朋友升一个。可以考虑到,需要记录,每个小朋友前面有多少个比他“连续一直”排名高的。
如果后面的小朋友排名比他高,后面的小朋友比前一个小朋友多拿一个,依次模拟即可。但是Wrong Answer了很多次T_T.
class Solution { public: int candy(vector<int> &ratings) { int len = ratings.size(); if(len == 0 || len == 1)return len; vector<int>bigger(ratings.size(),0); int count = 1; int now = 1; int max = 0; int i; for(i = 1;i < ratings.size();i++) { if(ratings[i] > ratings[i-1]) { if(max != 0) { if(bigger[i-1] < max-1) { count += max-1 - bigger[i-1]; } } max = 0; bigger[i] = 0; now += 1; count += now; } else if(ratings[i] < ratings[i-1]) { bigger[i] = bigger[i-1] + 1; if(now == 1) { count += bigger[i] + now; } else { max = now; now = 1; count += bigger[i] + now - (max-1); } } else { if(max != 0) { if(bigger[i-1] < max-1) { count += max-1 - bigger[i-1]; } } max = 0; bigger[i] = 0; now = 1; count += 1; } } if(max != 0) { if(bigger[i-1] < max-1) { count += max-1 - bigger[i-1]; } } return count; } };