代码随想录 | Day31 | 2023.09.13 | 贪心01

今日题目:

455.分发饼干
376. 摆动序列
53. 最大子数组和

今日总结

贪心第一天,没有套路,真难啊。感觉能够从局部最优推导出全局最优且举不出反例的情况就可以试试贪心。

455. 分发饼干

要点

  1. 没啥说的,贪心第一题

代码:

func findContentChildren(g []int, s []int) int {
    sort.Ints(g)
    sort.Ints(s)
    count := 0
    for i,j := 0, 0 ; i < len(g) && j <len(s); {
      if s[j] >= g[i] {
        count++
        j++
        i++
      } else {
        j++
      }
    }
    return count
}

376. 摆动序列

要点:

  1. 其实是一道挺难的题目,要考虑好各种特殊情况。
  2. 使用curDiff和preDiff来判断是否出现峰值,贪心的部分就是使峰值尽可能多。
  3. 要考虑以下几种特殊情况:情况一:上下坡中有平坡;数组首尾两端;单调坡中有平坡
  4. preDiff的更新位置非常关键,是在出现摆度时才更新,而不是随着数组的扫描而更新,这样才能考虑到单调坡的情况,否则会多计算坡度。
  5. 按照我的理解,如果每次循环都更新preDiff,实际上是更新了很多没用的坡度,比如一个单调上升的序列,实际上只需要考虑最前方的坡度。在if内部更新,可以这这么考虑,一个上升的线段和一个下降的线段需要进行匹配,匹配成功了才算是有一个坡度,此时才继续更新preDiff,等待寻找下一个方向不同的线段。
    两种特殊情况
func wiggleMaxLength(nums []int) int {
    preDiff := 0
    curDiff := 0
    res := 1 //默认有一个摆度
    for i := 0; i < len(nums)-1 ;i++{
        curDiff = nums[i+1]-nums[i]
        if (curDiff < 0 && preDiff >= 0 || curDiff > 0 && preDiff <=  0) {
            res++
            preDiff = curDiff   //更新时间点很关键
        }
    }
    return res
}

53. 最大子数组和

要点:

  1. 抓住关键点,负的累计和是无效的,一旦求到负的累计和便清空sum并从下一位重新求和。
func maxSubArray(nums []int) int {
    sum := nums[0]
    maxSum := sum
    for i:=1; i <len(nums); i++{
        if sum < 0 {
            sum = 0
        }
        sum += nums[i]
        if sum > maxSum {
            maxSum = sum
        }
    }
    return maxSum
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值