营销云平台语音外呼四川旅游seo整站优化
题目描述
分发糖果
思路
题目要求很简单:如果一个人的评分比它左边的孩子要高,那么分得的糖果要比左边的孩子多。如果评分比它右边的孩子高,那么分得的糖果还要比它右边的孩子多,每个孩子至少一个糖果。
贪心
如果一个孩子的评分比它相邻的孩子多的话,那么分得的糖果只能多一个,这样才能保证分得的糖果最少。
我们可以遍历数组两次,第一次遍历满足每个孩子的糖果比它左边的孩子糖果多(如果评分更高的话)。
第二次遍历就需要满足糖果比它右边的孩子多了(如果评分更高的话),但是这样还需要判断糖果是否本身就比右边的孩子多,如果本来就比你多的话,就不能变!因为增加是不需要的,我本来就比你多。减少也不行,否则糖果可能就少于左边的孩子了。
拓扑排序
将数组看作一个有向图
代码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);}
};