Leetcode 135 -- 贪心&拓扑排序

题目描述

分发糖果

思路

题目要求很简单:如果一个人的评分比它左边的孩子要高,那么分得的糖果要比左边的孩子多。如果评分比它右边的孩子高,那么分得的糖果还要比它右边的孩子多,每个孩子至少一个糖果。

贪心
如果一个孩子的评分比它相邻的孩子多的话,那么分得的糖果只能多一个,这样才能保证分得的糖果最少。
我们可以遍历数组两次,第一次遍历满足每个孩子的糖果比它左边的孩子糖果多(如果评分更高的话)。
第二次遍历就需要满足糖果比它右边的孩子多了(如果评分更高的话),但是这样还需要判断糖果是否本身就比右边的孩子多,如果本来就比你多的话,就不能变!因为增加是不需要的,我本来就比你多。减少也不行,否则糖果可能就少于左边的孩子了。

拓扑排序
将数组看作一个有向图

代码1 贪心

class Solution {
public:
    int candy(vector<int>& w) {
        int n = w.size();
        vector<int> f(n, 1);
        for(int i = 1; i < n; i ++ )
        {
            if(w[i] > w[i - 1]) f[i] = f[i - 1] + 1;
        }
        for(int i = n - 2; i >= 0; i -- )
        {
            if(w[i] > w[i + 1] && f[i] <= f[i + 1]) f[i] = f[i + 1] + 1;
        }
        
        int sum = accumulate(f.begin(), f.end(), 0);
        return sum;
    }
};

代码2 topsort

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();
        vector<int> indegrees(n, 0);
        for (int i = 0; i < n; ++i) {
            if (i > 0 && ratings[i] > ratings[i - 1]) ++indegrees[i]; //评分大于邻位时,增加入度
            if (i + 1 < n && ratings[i] > ratings[i + 1]) ++indegrees[i];
        }
        queue<int> q;
        for (int i = 0; i < n; ++i) {
            if (indegrees[i] == 0) q.push(i);
        }
        vector<int> candies(n, 0);
        int iter = 1;
        while (!q.empty()) {
            int s = q.size();
            while (s-- > 0) {
                int i = q.front();
                q.pop();
                candies[i] = iter;
                if (i > 0 && ratings[i] < ratings[i - 1]) {
                    --indegrees[i - 1];
                    if (indegrees[i - 1] == 0) q.push(i - 1);
                }
                if (i + 1 < n && ratings[i] < ratings[i + 1]) {
                    --indegrees[i + 1];
                    if (indegrees[i + 1] == 0) q.push(i + 1);
                }
            }
            ++iter;
        }
        return accumulate(candies.begin(), candies.end(), 0);
    }
};
posted @ 2022-09-30 08:57  光風霽月  阅读(17)  评论(0编辑  收藏  举报