贪心算法——力扣455.分发饼干 ,376摆动序列,53最大子序和

本文介绍了在LeetCode力扣平台上三个问题的解法,涉及向量排序(从小到大和从大到小)、使用贪心策略解决分发饼干和摆动序列问题,以及如何优化最大子数组和的动态规划算法。
摘要由CSDN通过智能技术生成

以下将会有力扣上题目思路和与要注意的内容的详细讲解,并附上正确代码。

知识漏洞:

向量排序函数

vector<int> vec{1,2,3,4};

//默认从小到大排序  1234
sort(vec.begin(),vec.end());
//从大到小排序 4321
sort(vec.begin(),vec.end(),greater<int>());

 

力扣题目

一.  力扣455.分发饼干 

1.思路:

就是最简单的贪心方法,分别将胃口值和饼干尺寸从大到小进行排序,一一对应进行比较,如果胃口值小于等于饼干尺寸则分配,反之对下一个孩子的胃口与当前饼干进行匹配。

2.代码如下:

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end(),greater<int>());
        sort(s.begin(),s.end(),greater<int>());
        int i = 0,j = 0,con = 0;
        while(i < g.size() && j < s.size())
        {
            if(g[i]<=s[j])
            {
                con++;
                i++;
                j++;
            }
            else
            {
                i++;
            }
        }
        return con;
    }
};

 

二. 376摆动序列

1.思路

这道题我们要知道我们想要的序列是这样的,如图所示:

这种增减更替的,代码中我们用con记录可以纳入摆动序列的元素的个数,如果遇到如下图所示的持续增或减,那么我们把最大值和最小值也就是结点处的元素纳入摆动序列之中。

如图所示,一目了然:

2.代码完成

这里我用next来确定我们需要的下一个元素应大于上一个元素还是小于上一个元素。

循环判断时也是根据next的值和当前元素与上一个元素的大小关系是否满足条件来判断的。

代码如下:

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int s = nums.size();

        //分别对向量长度为一和向量长度为零的情况进行处理
        if(s == 0)
            return 0;
        if(s==1)
            return 1;

        //向量长度大于1时
        int con = 1;
        int next;//下一个差值需要是正数则next为1,需要为负则next为0
        int p = 0,q = 1;
        while(nums[q] == nums[p] && q<s-1)
        {
            q++;
            p++;
        }
        if(nums[q]>nums[p])
        {
            next = 0;
            con++;
        }
        if(nums[q]<nums[p])
        {
            next = 1;
            con++;
        }
        for(int i = q+1;i < nums.size();i++)
        {
            if(next == 1 && nums[i]>nums[i-1])
            {
                con++;
                next = 0;
            }
            if(next == 0 && nums[i]<nums[i-1])
            {
                con++;
                next = 1;
            }
        }
        return con;
    }
};

3.需要注意的点:

初始化next时需要考虑p和q的初始化,还要考虑元素数字相等的情况,所以我设置了循环。

三.53最大子数组和

1.思路

当当前子数组和是一个负数时,把这个负数看作是起点,那么只会使后边的数组和更小,所以这个时候就要放弃之前的子数组,使下一个元素作为起点重新开始。

同时在遍历的过程中我么要注意时刻更新最终结果,也就是最大数组和。

2.易错点

这是我一开始写的代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int con = 0;
        int r = INT32_MIN;//最大子数组和
        for(int i = 0;i < nums.size();i++)
        {
            con += nums[i];
            if(con < 0)
                con = 0;
            if(r < con)
                r = con;
        }
        return r;
    }
};

发现全是负数的时候跑不过,r会被更新为0,还不知道怎么改,其实只需要把两个if语句调换一下就好了,这样就可以找到最小的那个负数,就是最终结果。

还有就是要注意r要初始化为最小负数而不是0.

3.代码

思路会了代码so easy,一两分钟就能完成。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int con = 0;
        int r = INT32_MIN;//最大子数组和
        for(int i = 0;i < nums.size();i++)
        {
            con += nums[i];
            if(r < con)
                r = con;
            if(con < 0)
                con = 0;
        }
        return r;
    }
};

 

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值