首页 » 编程之美 » 正文

[leetcode_135]Candy

小朋友排在一排分糖果。每个小朋友至少有一个糖果,但是每个小朋友有个排名,排名高的小朋友比“邻居”的糖果要多。
问至少多少个糖果?
顺序模拟,假设第一个小朋友拿一个,如果后面的小朋友比他排名低,显然后面的小朋友拿后一个,前一个小朋友升一个。可以考虑到,需要记录,每个小朋友前面有多少个比他“连续一直”排名高的。
如果后面的小朋友排名比他高,后面的小朋友比前一个小朋友多拿一个,依次模拟即可。但是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;
    }
};

发表评论