代码随想录算法训练营第29天 | 贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和

代码随想录算法训练营第29天 | 贪心算法1:455.分发饼干、376.摆动序列、53.最大子序和

贪心算法基础理论
https://programmercarl.com/贪心算法理论基础.html
455.分发饼干
https://leetcode.cn/problems/assign-cookies/description/
代码随想录
https://programmercarl.com/0455.分发饼干.html
376.摆动序列
https://leetcode.cn/problems/wiggle-subsequence/
代码随想录
https://programmercarl.com/0376.摆动序列.html
53.最大子序和
https://leetcode.cn/problems/maximum-subarray/description/
代码随想录
https://programmercarl.com/0053.最大子序和.html#算法公开课

贪心算法理论基础

分类

  • 简单题目
    • 455:分发饼干
    • 1005:K次取反后最大化数组和
    • 860:柠檬水找零
  • 中等题目
    • 序列问题
    • 贪心解决股票问题
      • 122.买卖股票的最佳时机
      • 714。买卖股票的最佳时机+手续费
    • 两个维度权衡问题
      • 135:分发糖果
      • 406:身高重建队列
  • 有点难度
    • 区间问题
      • 55 跳跃游戏
      • 45 跳跃游戏2
      • 452 最少数量的箭引爆气球
      • 435 无重叠区间
      • 763 划分字母区间
      • 56 合并区间
    • 53.最大子序列和
    • 134.加油站
    • 968.监控二叉树

核心思想

  • 每个阶段的局部最优——>全局最优

解题步骤

  • 问题划分为子问题
  • 找出合适的贪心策略
  • 求解每个子问题的最优解
  • 局部最优解堆叠成全局最优解

455.分发饼干

题解思路

  • 方法一:从小开始比较
  • 方法二:从大开始比较
  • 直接用栈模拟场景

题解代码

## 
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g_st = sorted(g)
        s_st = sorted(s)
        res = 0
        for i in range(len(s_st)):
            if res<len(g) and s_st[i]>=g_st[res]:
                res = res+1
        return res
## 栈模拟
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g_st = sorted(g)
        s_st = sorted(s)
        res = 0
        while s_st and g_st:
            chil = g_st.pop()
            cookie = s_st.pop()
            if cookie>=chil:
                res = res+1
            else:
                s_st.append(cookie)
        return res

376. 摆动序列

题解思路

  • 2种特殊情况
    1. 出现平坡不改变方向
    2. 出现平坡但改变方向
  • 双指针/列表存储diff

题解代码

## 双指针
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        pre_diff,curr_diff,res = 0,0,0
        for i in range(1,len(nums)):
            curr_diff = nums[i]-nums[i-1]
            if curr_diff*pre_diff<=0 and curr_diff!=0:
                res = res+1
                pre_diff = curr_diff
        return res+1

53. 最大子序和

题解思路

  • 如果前面的数字之和小于0 就归0 已经不是最大和
  • 考虑合适将sum赋值到res中

题解代码

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = -float('inf')
        sum_ = 0 
        for i in range(len(nums)):
            sum_ = sum_+nums[i] ##先赋值 不满足就归零了 
            res = max(sum_,res)
            if sum_<=0:
                sum_ = 0
        return res
posted @ 2024-07-19 10:48  哆啦**  阅读(1)  评论(0编辑  收藏  举报