一、贪心算法
保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
1 分配问题
1.1 Assign Cookies(Easy) 455.分发饼干
https://leetcode-cn.com/problems/assign-cookies/
题解:
饥饿度最小的孩子最容易吃饱,所以先考虑这个孩子,把大于等于这个孩子饥饿度的、且大小最小的饼干给这个孩子。所以先对孩子和饼干按照从小到大排序然后循环筛选。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int child = 0, cookie = 0;
while (child < g.size() && cookie < s.size()){
if (g[child] <= s[cookie]) child++;
cookie++;
}
return child;
}
};
1.2 Candy(hard) 135.分发糖果
https://leetcode-cn.com/problems/candy/
题解:
两次遍历,先从左到右,然后从右到左,判断两边的数值是否比中间的大。
class Solution {
public:
int candy(vector<int>& ratings) {
// sort(ratings.begin(), ratings.end());
int length = ratings.size();
if (length < 2) return length;
vector<int> nums(length, 1);
for (int i = 1; i < ratings.size(); i++){
if (ratings[i] > ratings[i-1]){
nums[i] = nums[i-1] + 1;
}
}
for (int i = length - 1; i > 0; i--){
if (ratings[i-1] > ratings[i]){
nums[i-1] = max(nums[i-1], nums[i]+ 1);
}
}
return accumulate(nums.begin(), nums.end