第八章 贪心算法 part01
今日任务: 理论基础 ; 455.分发饼干 ;376. 摆动序列 ; 53. 最大子序和
卡哥建议:贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律, 没有思路就立刻看题解。基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。 学完贪心之后再去看动态规划,就会了解贪心和动规的区别。
重点:
参考链接:代码随想录:代码随想录 (programmercarl.com)
补充:
理论基础
题目讲解(全):代码随想录
题目建议:难点就是如何通过局部最优,推出整体最优;最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧。贪心算法一般分为如下四步:
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
视频讲解:
自己实现过程中遇到哪些困难:
每日精华:
455.分发饼干
题目讲解(全):代码随想录
题目建议:
刷题链接:力扣题目链接
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index = s.size()-1;
int result=0;
for(int i = g.size()-1; i >=0; --i) {
if(index >=0 && g[i] <= s[index]){
index--;
result++;
}
}
return result;
}
};
视频讲解:贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
376. 摆动序列
题目讲解(全):代码随想录
题目建议:
刷题链接:力扣题目链接
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
//摆动上下交错,所以计算差值,1特殊记
if (nums.size() <= 1) return nums.size();
int result=1;
int prediff=0;
int curdiff=0;
for(int i=0;i<nums.size()-1;++i){
curdiff =nums[i+1]-nums[i];
if((prediff>=0 && curdiff<0) || (prediff<=0 && curdiff>0)){
result++;
prediff = curdiff;
}
}
return result;
}
};
视频讲解:
贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列 (opens new window)
看到题目的第一思路:
看完代码随想录之后的想法:
还有动态规划解法--与进阶版
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
53. 最大子序和
题目讲解(全):代码随想录
题目建议:
刷题链接:力扣题目链接
//暴力解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count =0;
for(int i = 0; i<nums.size(); ++i){
count = 0;
for(int j = i; j<nums.size(); ++j){
count+=nums[j];
result = result > count ? result:count;
}
}
return result;
}
};
//贪心算法
//贪心解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count =0;
for(int i = 0; i<nums.size(); ++i){
count += nums[i];
result = count > result?count:result;
if(count <= 0){
count = 0;
}
}
return result;
}
};
动态规划
视频讲解:贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和
看到题目的第一思路:
看完代码随想录之后的想法:
自己实现过程中遇到哪些困难:
每日精华:
类似题目:
今日收获,记录一下自己的学习时长:
优质文章:学习参考: