代码随想录算法训练营第三十一天| 455.分发饼干 376. 摆动序列53. 最大子序和

455.分发饼干   题目链接

思路

贪心算法:通过局部最优得到整体最优

解题方法

 先对两个数组排序,用大的饼干满足胃口大的小孩,尽量不浪费饼干.

先遍历胃口, 再遍历饼干。

若先遍历饼干,饼干在for循环会一直做减减操作,导致饼干一直不满足胃口。

另外在for循环里,遍历饼干时,要用if,如果用while,若满足条件,则会一直循环

Code

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        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&&g[i]<=s[index])
            {
                result++;
                index--;
            }
        }
        return result;

    }
};

复杂度

时间复杂度:

O(nlogn)

空间复杂度:

O(1)

376. 摆动序列  题目链接

思路

三种情况:

1.上下坡有平坡

2.首尾两个元素

3.单调坡有平坡

解题方法

 1.设定标准:保留最右边的峰值

2.假设最前面有一个和第一个元素相等的元素,假设有一个平坡。

3.在for循环里,只记录prediff的峰值方向是否改变,不纠结值的大小是否改变。所以将“prediff=curdiff”放在for循环里

Code

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;

    }
};

复杂度

时间复杂度:

O(n^2)

空间复杂度:

O(n)

53. 最大子序和    题目链接

思路

局部最优:当连续和为正数时,会增大nums[i];当连续和为负数时,会减小nums[i];所以一旦连续和为负数时,就把nums[i]作为起始位置。同时把count更新为0.

解题方法

 把result初始值设为最小值,for循环,让count累加,如果count>result,就更新result值,如果count小于0,就把nums[i]做为起始位置

Code

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result=INT_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;


    }
};

复杂度

时间复杂度:

O(n)

空间复杂度:

O(n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值