理论基础
贪心算法的本质是由局部最优推到全局最优,没有特定的套路
455.分发饼干
455. 分发饼干 - 力扣(LeetCode)
本题考虑将大饼干喂给胃口大的孩子,遍历孩子胃口的数组,用大饼干依次喂,直到满足条件,再移动饼干的位置
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int count = 0;
int start = s.length - 1;
//要遍历小孩胃口,不合适就下一个,因为要从大到小把饼干分完
for (int i = g.length - 1; i >= 0; i--) {
//这里用if就可以,不需要用while
if (start >= 0 && s[start] >= g[i]) {
start--;
count++;
}
}
return count;
}
}
376. 摆动序列
376. 摆动序列 - 力扣(LeetCode)
本题局部最优是“删除”单调序列上中间的值,由此可以推出全局最优最长摆动子序列的长度。要注意有平坡的情况,要么都在curDiff加上=,要么在preDiff加上=
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length <= 1) {
return nums.length;
}
int curDiff = 0;
int preDiff = 0;
int count = 1;
for (int i = 1; i < nums.length; i++) {
curDiff = nums[i] - nums[i - 1];
if (curDiff > 0 && preDiff <= 0 || curDiff < 0 && preDiff >= 0) {
count++;
preDiff = curDiff;
}
}
return count;
}
}
53. 最大子序和
53. 最大子数组和 - 力扣(LeetCode)
本题主要是如何找到子数组的起始位置,当前面数组和为负数并且下一个数为正数时,那么就将起始位置设置为这个正数,然后再持续计算比较子数组总和
class Solution {
public int maxSubArray(int[] nums) {
int maxSum = Integer.MIN_VALUE;
int sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
maxSum = Math.max(sum, maxSum);
//sum小于0时,就重新设置起始位置
if (sum < 0) {
sum = 0;
}
}
return maxSum;
}
}