Leetcode刷题Day31---------------------------贪心算法
1. 理论基础
- 文章链接:
https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html - 题目链接:https://leetcode.cn/problems/assign-cookies/
- 视频链接:https://www.bilibili.com/video/BV1WK4y1R71x/?spm_id_from=333.788&vd_source=1fb98c05c7fbfd06713f014ea5079d5b
局部最优 推出 全局最优
2. 455.分发饼干
重点:
- 胃口一定要在外层循环,饼干在里层循环**
- 可以让大饼干先满足胃口大的小孩,也可以让小饼干先满足胃口小的小孩
class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);
int index=s.length-1;//饼干的序列
int count=0;
for(int i=g.length-1;i>=0;i--){//胃口的序列
if(index>=0&&g[i]<=s[index]){//要先写饼干序列>=0
index--;
count++;
}
}
return count;
}
}
3. 376. 摆动序列
- 题目链接:https://leetcode.cn/problems/wiggle-subsequence/
- 文章链接:https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html
- 视频链接:https://www.bilibili.com/video/BV17M411b7NS/?spm_id_from=333.788&vd_source=1fb98c05c7fbfd06713f014ea5079d5b
- 上下破有平坡------------主要的逻辑,记得破度可以为0
- 首尾-------------首部:造首,和第一个元素一样;尾部:默认有一个摆动 -> result=1开始
- 单调
class Solution {
public int wiggleMaxLength(int[] nums) {
if(nums.length==0) return 0;
int preDiff=0;
int curDiff=0;
int result=1; //初始的result要从1开始
for(int i=1;i<nums.length;i++){//i从1循环即可
curDiff=nums[i]-nums[i-1];
if(curDiff<0&&preDiff>=0||curDiff>0&&preDiff<=0){ //prediff 可能等于0,表示初始的状态
result++;
preDiff=curDiff;
}
}
return result;
}
}
4. 53. 最大子序和
- 题目链接:https://leetcode.cn/problems/maximum-subarray/
- 文章链接:https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html
- 视频链接: bilibili.com/video/BV1aY4y1Z7ya/?spm_id_from=pageDriver&vd_source=1fb98c05c7fbfd06713f014ea5079d5b
解题关键:
- 当和为负数时,要丢弃掉,重新开始加,因为,只有一直加正数,和才会逐渐变大。
- 要有两个变量,count和sum。sum初始值是系统最小,为了记录当数组里都为负时的值。
class Solution {
public int maxSubArray(int[] nums) {
if(nums.length==1) return nums[0];
int count=0;
int sum=Integer.MIN_VALUE; //sum初始wei0
for(int i=0;i<nums.length;i++){
count+=nums[i];
sum=Math.max(count,sum); //sum赋值为count和sum里的最大值
if(count<=0) count=0;
}
return sum;
}
}