代码随想录算法训练营第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种特殊情况
- 出现平坡不改变方向
- 出现平坡但改变方向
- 双指针/列表存储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
标签:int,res,随想录,st,算法,https,子序,贪心
From: https://www.cnblogs.com/P201821440041/p/18310408