news 2026/9/30 16:15:58

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

作者头像

张小明

前端开发工程师

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

455.分发饼干

目标:

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

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

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

步骤:

  1. g、s都排序
  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/9/29 8:42:11

用过才敢说 10个AI论文网站测评!本科生毕业论文写作必备工具推荐

在当前学术写作日益依赖AI工具的背景下&#xff0c;本科生在毕业论文写作过程中常面临选题困难、文献检索繁琐、格式规范不熟、改稿效率低等挑战。为了帮助学生更高效地完成论文&#xff0c;笔者基于2026年的实测数据与用户反馈&#xff0c;对市面上主流的AI论文工具进行了系统…

作者头像 李华
网站建设 2026/9/26 23:41:51

发票红章盖住金额怎么办

财务人员在日常工作中&#xff0c;常常遇到一个让人头疼的问题&#xff1a;发票上的红色印章不小心盖到了金额区域&#xff0c;导致关键数字被遮挡。这种情况到底能不能用&#xff1f;又该如何处理&#xff1f;本文将从实务操作和技术解决方案两个角度&#xff0c;帮你彻底搞定…

作者头像 李华
网站建设 2026/9/30 9:00:30

ISO 13485深度解析:医疗设备软件开发的实践指南

1 ISO 13485&#xff1a;医疗设备质量的“操作系统”从医疗设备软件开发的角度看&#xff0c;ISO 13485可以被理解为整个医疗器械生命周期的“操作系统”。它不是一个具体的技术标准&#xff0c;而是一个框架性的质量管理体系&#xff08;QMS&#xff09;标准&#xff0c;专门为…

作者头像 李华
网站建设 2026/9/29 8:54:58

Agentic Coding一些实践总结

最近一年AI编码飞速发展&#xff0c;现在我的90%以上的代码都是出自AI。想想在2024年调用OpneAI官方接口&#xff08;3.5模型&#xff09;,超过10K的Token就让LLM的上下文完全混乱&#xff0c;导致LLM无法记住太多东西&#xff0c;更不用说调用工具&#xff0c;生成代码了。到目…

作者头像 李华
网站建设 2026/9/29 8:54:47

String池原理详解:Java字符串创建与内存优化

理解String池是掌握Java内存管理和性能优化的关键一步。它本质上是一个位于堆内存中的字符串常量池&#xff0c;用于存储字符串字面量&#xff0c;其核心目的是通过重用不可变的字符串对象来节省内存、提升程序效率。对于开发者而言&#xff0c;深入理解其工作机制能有效避免一…

作者头像 李华
网站建设 2026/9/29 21:36:20

VS2026对比VSS2005:版本控制工具新老差异与迁移指南

从VSS2005到VS2026&#xff0c;版本控制工具经历了革命性的变化。作为一名长期使用微软技术栈的开发者&#xff0c;我见证了从集中式、文件锁定的旧模式&#xff0c;到如今分布式、高效协作的现代开发流程。这种演进不仅仅是工具的升级&#xff0c;更是开发理念的深刻变革。 V…

作者头像 李华