贪心算法就是利用局部最优来获取全局最优的算法,需要关注的地方就在于如何确认局部最优的关系
455.分发饼干
这道题思路比较简单,我们要用最小的饼干去喂饱别人,所以将两个数组排序遍历,只要当前小的饼干可以满足一个人,那就满足条件,不然就换大一号的饼干。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int j = 0;
for (int i = 0; i < s.size();i++){
if (j < g.size() && g[j] <= s[i]){
j++;
}
}
return j;
}
};
376. 摆动序列
如果数组保持递增,那中间值完全可以忽略掉,只取两边的极值
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int pre = 0;
int cur = 0;
int result = 1;
for (int i = 1; i < nums.size(); i++){
cur = nums[i]-nums[i-1];
if (pre*cur <= 0 && cur != 0) {
result++;
pre = cur;
}
}
return result;
}
};
53. 最大子序和
记录每一位数的当前总和,只要是正数,那说明和一定会变大。如果当前为负了,说明会使后面的和变小,要去除掉。另外维护一个记录最大值的变量,最后输出即可。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int ans = INT32_MIN;
int sum = 0;
for(int i = 0; i < nums.size(); i++){
sum = sum + nums[i];
if (sum > ans){
ans = sum;
}
if (sum < 0) sum = 0;
}
return ans;
}
};