代码随想录算法训练营day26|455.分发饼干 376. 摆动序列 53. 最大子序和
学习资料:https://programmercarl.com/贪心算法理论基础.html#算法公开课
贪心算法Part1
求局部最优解,最终达到全局最优
455.分发饼干(大胃口吃大饼干)
点击查看代码
class Solution(object):
def findContentChildren(self, g, s):
"""
:type g: List[int]
:type s: List[int]
:rtype: int
"""
# 贪心算法:每次局部最优(大胃口吃大饼干),使得最终全局最优
# 先对两个数组排序,然后都从大到小遍历
g.sort()
s.sort()
max_num = 0
j_cooki = len(s)-1
# 先遍历胃口
for i in range(len(g)-1, -1, -1):
# 要求胃口大于等于饼干;因为下面要减一,所以这里要非负数,保证最多把饼干遍历完,如果还没有结果也要终止
if j_cooki>=0 and g[i]<=s[j_cooki]:
max_num += 1
j_cooki -= 1 # 再开始遍历饼干
return max_num
376.摆动序列(有好多情况要考虑;主要是拐点处摆动)
点击查看代码
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
"""
贪心法,3种摆动类型:升-降-升-降,升-平-降,单调(升-平-升,降-平-降)
摆动:此数与前数的差值,此数与后数的差值,两差值一正一负最佳,或者有一个为0
"""
prediff=0 # 设置初始的与前值的差为0,相当于在第一个前面加一个一样的数
maxlength = 1 # 默认最后一个数必为摆动,遍历时就在前一数停止,保证i+1始终存在
for i in range(len(nums)-1):
curdiff = nums[i+1]-nums[i] # 该数与后一数的差值
if (prediff<=0 and curdiff>0) or (prediff>=0 and curdiff<0): # 等于0是考虑平
maxlength += 1
prediff = curdiff # 只在摆动处再更新,避免类型3的平处多了个摆动
return maxlength
53.最大子序和(贪心:当前一段和为负数,就丢弃这一段,从下一段重新开始加和;整个过程中只要和比前一次大就要更新一次,直到遍历完)
点击查看代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 贪心思路:先设置目标值为无穷小,开始遍历数组,
# 1 只要和大于预设目标值,就替换为目标值,
# 2 当和为负,说明此时的和对后续数字有拖累,就甩掉,重新从下一个数开始从0求和,若和大于目标值,也是与1一致,将其替换为目标值
result = float('-inf')
count = 0
for i in range(len(nums)):
count += nums[i]
if count>result:
result = count
if count<0:
count = 0
return result
PS:补了昨天的,昨天去听宣讲没心情学,今天的趁周末补习
昨天看到一个小众公司,希望有机会冲一冲,今天又是考试的一天,手都写麻了,累,英语是真菜,话都说不清楚
阴转多云
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现