代码随想录 第八章 贪心算法 part01 455.分发饼干 376. 摆动序列 53. 最大子序和

455.分发饼干

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int p1=g.size()-1, p2=s.size()-1, result=0;
        while(p1>=0&&p2>=0){
            while(g[p1]>s[p2]){
                p1--;
                if(p1<0) return result;
            }
            p1--;
            p2--;
            result++;
        }
        return result;
    }
};

尺寸为3的饼干能满足胃口为3、2、1的小朋友,而尺寸为1的饼干只能满足胃口为1的小朋友,所以要满足尽量多的小朋友需要让所选的小朋友的胃口值尽可能接近饼干的尺寸。在对小朋友胃口和饼干尺寸排序后,从最大尺寸饼干开始找饼干能满足的最大胃口小朋友,直到饼干或小朋友遍历完。

376. 摆动序列

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        vector<int>d;
        for(int i=1;i<nums.size();i++){
            d.push_back(nums[i]-nums[i-1]);
        }
        for(int i=0;i<d.size();){
            if(d[i]==0) d.erase(d.begin()+i);
            else i++;
        }
        for(int i=1;i<d.size();){
            if(d[i]*d[i-1]>0) d.erase(d.begin()+i);
            else i++;
        }
        return d.size()+1;
    }
};

这题需要想明白的要点就是,摆动序列长度就是差值序列中符号变换次数数量+2,只需要求取差值序列,将0去除,再将相邻同符号元素删掉,最后保留的序列长度+1即是最长摆动序列。因为是笔者脑估的性质,所以笔者的代码比较多余,随想录有更加严谨的说明与简洁的代码。

53. 最大子序和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int mx=INT_MIN, sm=0;
        for(int i=0;i<nums.size();i++){
            sm+=nums[i];
            if(sm>mx) mx=sm;
            if(sm<=0) sm=0;
        }
        return mx;
    }
};

这道笔者只能想到暴力解法,即将所有长度所有可能性均求一遍,所以笔者还是看了随想录的思路。求取首先的一点就是序列的起始元素为正,这很好理解,但为什么再求和的过程中需要和为负时就要清零从下一位开始求呢,以下是笔者的理解。从求和为负的序列整体而言,这部分为负,那么这段序列就不可能出现在最大和序列的边缘,从求和的过程分析,当一段序列前段求和为正,直到最后一位求和为负时,说明能对序列和起正向作用的部分在序列前部,后部起负面作用,且负面作用大于正面作用。由于从左向右的遍历顺序,要包含起正面作用的序列,则必须同时包含起负面作用的部分,得不偿失,所以在遇到求和为负的部分就舍弃,从下一位重新开始求和。

代码随想录 第八章 贪心算法 part01

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值