文档链接:https://programmercarl.com/
LeetCode455.分发饼干
题目链接:https://leetcode.cn/problems/assign-cookies/
思路:我采用的是优先用小饼干喂小孩。
贪心:
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int count = 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int i = 0;
int j = 0;
while(i < s.size() && j < g.size()) {
if(s[i] >= g[j]) {
count++;
i++;
j++;
} else {
i++;
}
}
return count;
}
};
LeetCode376.摆动序列
题目链接:https://leetcode.cn/problems/wiggle-subsequence/
思路:没太明白
贪心:
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() == 1) return 1;
int prediff = 0;
int curdiff = 0;
int result = 1;
for(int i = 0; i < nums.size() - 1; i++) {
curdiff = nums[i] - nums[i + 1];
if((prediff >= 0 && curdiff < 0) || (prediff <= 0 && curdiff > 0)) {
result++;
prediff = curdiff;
}
}
return result;
}
};
LeetCode53.最大子数和
题目链接:https://leetcode.cn/problems/maximum-subarray/
思路:遇到连续和为负数的情况就舍去,因为负数只会让后面加的数变小,但不是遇到负数就舍去,而是连续和。同时注意存一下每一次的最大值。
贪心:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int sum = 0;
for(int i = 0; i < nums.size(); i++) {
sum += nums[i];
if(sum > result) result = sum;
if(sum < 0) sum = 0;
}
return result;
}
};
总结:贪心真的好难,我原本以为的不就是每次取最优吗?不就是局部最优推出全局最优吗?结果拿到题目根本不知道什么是局部最优?什么是全局最优?