贪心算法
代码随想录链接:代码随想录 (programmercarl.com)
局部最优->全局最优
贪心算法一般分为如下四步:
- 将问题分解为若干个子问题
- 找出适合的贪心策略
- 求解每一个子问题的最优解
- 将局部最优解堆叠成全局最优解
这个四步其实过于理论化了,做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。
455.分发饼干
代码随想录链接:代码随想录 (programmercarl.com)
要注意谁是用for循环来控制,谁是index来控制。
因为我一开始就想小饼干满足小胃口,所以画个图想一下就可以了
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(),g.end());
sort(s.begin(),s.end());
int index=0;
for(int i=0;i<s.size();i++){
if(index<g.size()&&g[index]<=s[i]){
index++;
}
}
return index;
}
};
376. 摆动序列
代码随想录链接:代码随想录 (programmercarl.com)
根据题意可以把末尾元素默认成一个摆动。遍历只到倒数第二个元素。
前面延伸一个元素来计算prediff(prediff初始化为0)。
几种情况的讨论
prediff的更新。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
int prediff=0;
int curdiff=0;
int result=1;
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;
}
};
53. 最大子序和
代码随想录链接:代码随想录 (programmercarl.com)
思路还是比较简单的。
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];
if(count>result){
result=count;
}
if(count<0) count=0;
}
return result;
}
};