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

文章介绍了如何使用贪心算法解决LeetCode中的三个问题:如何公平地分配饼干以满足孩子们的需求,找到数组中的摆动序列,以及计算最大子数组和。每个问题的解题思路都强调了通过局部最优解来得出全局最优解的方法。
摘要由CSDN通过智能技术生成

455.分发饼干

题目链接:https://leetcode.cn/problems/assign-cookies/

var findContentChildren = function(g, s) {
g=g.sort((a,b)=>a-b)
s=s.sort((a,b)=>a-b)
// res用来记录可以喂饱多少孩子
let res=0
let index=s.length-1
for(let i=g.length-1;i>=0;i--){
    if(index>=0&&s[index]>=g[i]){
        res++
        index--
    }
}
return res
};

解题思路:

1.贪心算法问题主要是找出局部最优然后推出全局最优即可

2.寻找最大的饼干以满足最大的符合的胃,且让饼干尺寸不过于太大而浪费,寻找最符合接近的即可。

376.摆动序列

题目链接:https://leetcode.cn/problems/wiggle-subsequence/

var wiggleMaxLength = function(nums) {
if(nums.length===1) return nums.length
// 默认前面会延长一点
let prediff=0 //前一个坡度
let curdiff=0 //下一个坡度
// 默认最右端有一个坡度
let result=1
for(let i=0;i<nums.length-1;i++){
    curdiff=nums[i+1]-nums[i]
    if(prediff>=0&&curdiff<0||prediff<=0&&curdiff>0){
        // 记录波动
        result++
        prediff=curdiff
    }
}
return result
};

解题思路:

1.理解题意,分析各种情况

第一种情况:上下坡中有平坡 第二种情况:数组首位两端,假设数组最前面还有一个数组,且prediff=0,prediff为前一个坡度,最后一个数为一个坡度。第三种情况:单调坡度有平坡,我们只需要在这个坡度摆动变化的时候,更新prediff就行,这样prediff在单调区间有平坡的时候就不会发生变化,造成我们代码结果与理想不符。

53.最大子数组和

题目链接:https://leetcode.cn/problems/maximum-subarray/

var maxSubArray = function(nums) {
let result=-Infinity
// 用来记录累加和
let count=0
for(let i=0;i<nums.length;i++){
    count+=nums[i]
    if(count>result){
        result=count
    }
    if(count<0){
        // 将下一个nums[i]作为新的起点,重新开始技术
        count=0
    }
}
return result
};

解题思路:

1.有一个误区是不要一碰到负数就丢弃,而是如果累加之和为负数加上下一个数让其更小,那么就丢弃,从下一个数开始重新计数即可,通过实现局部最优解,来实现全局最优解。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值