news 2026/3/17 1:52:21

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录算法训练营第二十五天| 455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干

目标:

  • g[i]:第i个孩子的胃口值(至少要这么大的饼干才满足)
  • s[j]:第j块饼干的尺寸
    每个孩子最多一块饼干、每块饼干最多给一个孩子。
    问最多能满足多少孩子。

核心思路:贪心 + 排序 + 双指针

策略:用最小的饼干去满足胃口最小的孩子,能满足就给,不满足就换更大的饼干。

步骤:

  1. gs都排序
  2. 两个指针:
    • i指向当前孩子(从小胃口开始)
    • j指向当前饼干(从小尺寸开始)
  3. 如果s[j] >= g[i]:满足一个孩子,i += 1, j += 1
  4. 否则:饼干太小,只能换更大的饼干,j += 1

代码

classSolution:deffindContentChildren(self,g:List[int],s:List[int])->int:# 让“最小胃口”优先配“最小能满足它的饼干”g.sort()s.sort()i=0# 孩子指针:当前要满足的孩子j=0# 饼干指针:当前可用的最小饼干count=0whilei<len(g)andj<len(s):# 当前饼干能满足当前孩子:成功分配ifg[i]<=s[j]:i+=1j+=1count+=1else:# 饼干太小,无法满足任何“更大胃口”的孩子# 只能丢掉这块饼干,换下一块更大的j+=1returncount

只要“孩子还没分完”并且“饼干还没用完”,分配就有意义。少一个都不行。
所以必须是:

whilei<len(g)andj<len(s):
项目复杂度说明
时间复杂度O(n log n + m log m)两次排序(n=len(g),m=len(s))+ 一次双指针扫描
空间复杂度O(1)(不算排序)只用常数变量;若语言排序用额外空间则取决于实现

376. 摆动序列

目标:
给你一个整数数组nums,找一个最长子序列,满足:

  • 相邻差值正负交替
    nums=[1,7,4,9,2,5]diff=[+6,-3,+5,-7,+3]✅ 全程交替 答案=6
  • 子序列不要求连续(可以跳着选)

👉 返回这个最长长度。

核心思路(贪心)

我们只关心“方向有没有变”,不关心数值具体多大。
只要方向变了,就一定能多摆一下。

我们同时维护两种“结尾状态”

状态意味着什么
up当前这条序列最后一步是上升
down当前这条序列最后一步是下降

我们在贪:尽可能多地制造“方向切换”

只在方向发生改变的时候更新:

如果今天比昨天高: 说明出现“上升” 那我可以接在“下降”后面 → up = down + 1 如果今天比昨天低: 说明出现“下降” 那我可以接在“上升”后面 → down = up + 1

⚠️ 如果相等:

  • 没有方向
  • 对摆动没帮助
  • 直接忽略

代码

classSolution:defwiggleMaxLength(self,nums:List[int])->int:# 边界情况:0 或 1 个数iflen(nums)<2:returnlen(nums)# up: 以“上升”结尾的最长摆动子序列长度# down: 以“下降”结尾的最长摆动子序列长度up=down=1foriinrange(1,len(nums)):ifnums[i]>nums[i-1]:# 当前是上升 → 可以接在“下降”后面up=down+1elifnums[i]<nums[i-1]:# 当前是下降 → 可以接在“上升”后面down=up+1else:# 相等则忽略(不会形成摆动)continuereturnmax(up,down)
项目复杂度说明
时间复杂度O(n)一次遍历
空间复杂度O(1)只用两个变量

53. 最大子序和

目标:
给你一个整数数组nums,找一个连续子数组(必须连续),使它的和最大,返回这个最大和。

nums=[-2,1,-3,4,-1,2,1,-5,4]最大子数组=[4,-1,2,1]答案=6

核心思路(Kadane)

要么把当前数接在“之前的好子数组”后面,要么从当前数重新开始。

一段连续子数组,只要“前面已经亏钱了”,后面不管赚多少,都不该带着它

为什么这是“贪心且不会后悔”?

因为有一个铁律:

任何负的前缀,都只会拖后腿,
不可能让后面的子数组变得更大。

所以:

  • 丢掉负前缀 = 永远正确
  • 不存在“先忍着亏,后面赚更多”的情况

现在数组里的每个数可以想成:

  • 正数:赚钱
  • 负数:亏钱

你要找一段连续时间里赚得最多。

关键问题只有一个
当前这一刻,我是继续之前的这段“投资”,还是重新开一个新的?

情况 1:之前是正的

之前赚了+5现在来一个+3

👉 当然要接上
总收益 = 8(更大)

情况 2:之前是负的

之前亏了-5现在来一个+3

👉 立刻丢掉之前的
只要 +3 比 -2 好

所以我们维护两个量就够了:

  • cur_sum以当前位置结尾的最大子数组和
  • max_sum:目前为止见过的全局最大子数组和

代码

classSolution:defmaxSubArray(self,nums:List[int])->int:# cur_sum:以当前元素结尾的最大子数组和cur_sum=nums[0]# max_sum:目前为止见过的最大子数组和max_sum=nums[0]foriinrange(1,len(nums)):# 核心贪心:要不要之前那段?# 如果之前是负的,直接丢掉,从 nums[i] 重新开始cur_sum=max(nums[i],cur_sum+nums[i])# 更新全局最大值max_sum=max(max_sum,cur_sum)returnmax_sum
项目复杂度说明
时间复杂度O(n)一次遍历
空间复杂度O(1)只用常数变量
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/15 19:35:52

内网环境下,html5如何支持大文件的分块上传?

中石油旗下子公司大文件传输系统技术方案 一、项目背景与需求分析 作为中石油集团旗下专注于能源信息化领域的子公司&#xff0c;我司长期服务于政府及军工单位&#xff0c;在能源管理、安全生产等关键领域积累了丰富的行业经验。本次政府招投标项目提出的大文件传输需求具有…

作者头像 李华
网站建设 2026/3/14 6:06:14

2026必备!8个降AIGC工具千笔AI帮你降AI率

AI降重工具&#xff1a;论文降AIGC率的关键利器 随着人工智能技术的飞速发展&#xff0c;越来越多的学术研究和论文写作开始依赖AI工具。然而&#xff0c;AI生成的内容在查重系统中往往容易被识别为高AIGC率内容&#xff0c;影响论文的通过率。对于继续教育领域的学生和研究人…

作者头像 李华
网站建设 2026/3/15 20:38:50

达梦数据库与MySQL的核心差异解析:从特性到实践

达梦数据库与MySQL的核心差异解析&#xff1a;从特性到实践一、核心定位与架构差异1. 产品定位与生态2. 存储引擎与架构 二、语法与数据类型差异1. 数据类型适配2. SQL语法核心差异&#xff08;1&#xff09;建表语句&#xff08;2&#xff09;分页查询&#xff08;3&#xff0…

作者头像 李华
网站建设 2026/3/16 8:27:57

别选错专业了!张雪峰建议:计算机专业优先选网络安全,国家战略方向更有未来!

言 “计算机专业 一定要优先报网络安全,它是未来国家发展的大方向” 为什么推荐学网络安全&#xff1f; “没有网络安全就没有国家安全。”当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 01 高需求和就业前景…

作者头像 李华