1、将问题分解为若干个子问题
2、找出适合的贪心策略
3、求解每一个子问题的最优解
4、将局部最优解堆叠成全局最优解
455题:分发饼干
局部最优解:大饼干先喂给大孩子!!
注意:判断语句需要把index>=0写在前面,同时需要在最开始判断特殊情况,否则会报错
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
if(s.size()==0) return 0;
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&&s[index]>=g[i]){
result++;
index--;
}
}
return result;
}
};
result设置为1,默认最后一个为峰值。从第一个开始考虑
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=1;i<nums.size();i++){
curdiff=nums[i]-nums[i-1];
if((prediff>=0&&curdiff<0)||(prediff<=0&&curdiff>0)){
result++;
prediff=curdiff;
}
}
return result;
}
};
55:跳跃游戏
每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。关键是cover是一个整体变量,能多远到达。注意:必须要小于等于cover,能最远到达的位置
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover=0;
if(nums.size()==1) return true;
for(int i=0;i<=cover;i++){
cover=max(i+nums[i],cover);
if(cover>=nums.size()-1) return true;
}
return false;
}
};