LeetCode贪心算法

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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41169280/article/details/114710459