[贪心] leetcode 135 Candy
problem:https://leetcode.com/problems/candy/
一道贪心题,先从左往右扫一遍,保证右边比左边高分的拿到更多糖果,再从右往左扫一遍,保证左边比右边分高的拿到更多糖果,时间复杂度O(N)。
第一次的算法是顺序更新,O(N^2)的,每次发现右边比左边大还要回去更新所有的分数。最后一个数据点超时了……如下:
public: int candy(vector<int>& ratings) { vector<int> accept(ratings.size(), 1); for(int i = 0;i < ratings.size();i++) { if(i - 1 >= 0 && ratings[i] > ratings[i - 1]) { accept[i] = accept[i - 1] + 1; } else if(i - 1 >= 0 && ratings[i] < ratings[i - 1]) { for(int j = i - 1; j >= 0;j--) { if(ratings[j + 1] < ratings[j] && accept[j + 1] >= accept[j]) { accept[j] = accept[j + 1] + 1; } else { break; } } } } int res = accumulate(accept.begin(), accept.end(),0); return res; } };
优化后的算法如下:
class Solution { public: int candy(vector<int>& ratings) { vector<int> accept(ratings.size(), 1); for(int i = 0;i < ratings.size();i++) { if(i - 1 >= 0 && ratings[i] > ratings[i - 1]) { accept[i] = accept[i - 1] + 1; } } for(int i = ratings.size() - 1;i >= 0 ;i--) { if(i - 1 >= 0 && ratings[i] < ratings[i - 1]) { if(accept[i - 1] <= accept[i]) accept[i - 1] = accept[i] + 1; } } int res = accumulate(accept.begin(), accept.end(),0); return res; } };

浙公网安备 33010602011771号