提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基础知识
局部最优等于全局最优的时候,可以用贪心算法。
一、455分发饼干
局部最优:小饼干喂胃口小的小孩。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int res = 0;
if (s.size() == 0) {
return res;
}
sort(g.begin(), g.end());
sort(s.begin(), s.end());
for (int i = 0, j = 0; i < g.size() && j < s.size(); j ++) {
if (s[j] >= g[i]) {
res ++;
i ++;
}
}
return res;
}
};
二、376摆动序列
没思路,看了卡哥视频画的图感觉思如泉涌,暂停了自己写半天AC不了。。贪心法真难搞
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int res = 1;
int preDiff = 0, curDiff = 0;
for (int i = 0; i < nums.size() - 1; i ++) {
curDiff = nums[i+1] - nums[i];
if (preDiff * curDiff <= 0 && curDiff != 0) {
res ++;
preDiff = curDiff;
}
}
return res;
}
};
三、53最大子序和
没想到怎么贪心,这题感觉dp比较好写。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = nums[0];
for (int i = 1; i < nums.size(); i ++) {
if (nums[i-1] > 0) {
nums[i] += nums[i-1];
}
if (nums[i] > res) {
res = nums[i];
}
}
return res;
}
};
贪心法思路:
局部最优:当局部和为负数的时候,丢掉,从下个数重新开始。(感觉其实跟dp是一个思路)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int res = INT_MIN;
int sum = 0;
for (int i = 0; i < nums.size(); i ++) {
sum += nums[i];
res = max({res, sum});
if (sum < 0) {
sum = 0;
}
}
return res;
}
};