当前位置: 首页 > news >正文

二刷 LeetCode:75. 颜色分类 31. 下一个排列 复盘笔记

目录

一、75. 颜色分类(荷兰国旗问题)

题目回顾

思路复盘

核心思想

Python 代码实现

易错点 & 二刷心得

二、31. 下一个排列

题目回顾

思路复盘

核心步骤

Python 代码实现

易错点 & 二刷心得

三、两道题的共性总结 & 二刷收获


这两道题是数组 / 排序专题的经典中等题,也是面试中常考的 “原地操作” 类型,非常适合用来巩固双指针和贪心思想。二刷时我们重点拆解核心思路、优化写法,并总结通用解题模板。


一、75. 颜色分类(荷兰国旗问题)

题目回顾

给定一个包含红色、白色和蓝色、共n个元素的数组nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数012分别表示红色、白色和蓝色。

思路复盘

这道题的最优解是三指针法(荷兰国旗问题),时间复杂度 \(O(n)\),空间复杂度 \(O(1)\),一次遍历完成排序。

核心思想

定义三个指针:

  • p0:指向 0 的右边界,初始为 0
  • p2:指向 2 的左边界,初始为len(nums)-1
  • curr:当前遍历的元素指针,初始为 0

遍历规则:

  1. nums[curr] == 0:和nums[p0]交换,p0++curr++
  2. nums[curr] == 2:和nums[p2]交换,p2--(注意curr不增加,因为交换来的元素需要再判断)
  3. nums[curr] == 1:直接curr++
Python 代码实现

python

运行

def sortColors(nums: list[int]) -> None: p0 = curr = 0 p2 = len(nums) - 1 while curr <= p2: if nums[curr] == 0: nums[p0], nums[curr] = nums[curr], nums[p0] p0 += 1 curr += 1 elif nums[curr] == 2: nums[curr], nums[p2] = nums[p2], nums[curr] p2 -= 1 else: curr += 1

易错点 & 二刷心得

  1. 边界控制:循环条件必须是curr <= p2,因为p2左边的元素还未处理完。
  2. 交换 2 时的指针处理:交换currp2后,curr不能自增,因为新交换来的元素可能是 0 或 2,需要再次判断。
  3. 原地修改:题目要求不使用额外空间,所以不能用计数排序后再重写数组,三指针法是最优解。

二、31. 下一个排列

题目回顾

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。

思路复盘

这道题的核心是贪心思想,找到 “下一个更大” 的排列,关键步骤可以总结为 “找、换、反转” 三步。

核心步骤
  1. :从后往前找第一个nums[i] < nums[i+1]的位置i,这个位置是 “下降点”,后面的元素是降序的。
  2. :从后往前找第一个比nums[i]大的元素nums[j],交换nums[i]nums[j]
  3. 反转:将i之后的元素反转,使其变为升序,这样得到的就是比原排列大的最小排列。
Python 代码实现

python

运行

def nextPermutation(nums: list[int]) -> None: n = len(nums) # 步骤1:找下降点 i = n - 2 while i >= 0 and nums[i] >= nums[i+1]: i -= 1 # 步骤2:如果不是最后一个排列,找比nums[i]大的最小数并交换 if i >= 0: j = n - 1 while nums[j] <= nums[i]: j -= 1 nums[i], nums[j] = nums[j], nums[i] # 步骤3:反转i之后的部分 left, right = i + 1, n - 1 while left < right: nums[left], nums[right] = nums[right], nums[left] left += 1 right -= 1

易错点 & 二刷心得

  1. 下降点的理解:如果整个数组是降序的,说明没有下一个排列,直接反转整个数组即可。
  2. 交换后反转的必要性:交换nums[i]nums[j]后,i之后的部分仍然是降序的,反转后才能变成升序,得到最小的更大排列。
  3. 边界处理:当i < 0时,说明数组是降序的,直接反转整个数组即可,无需额外处理。

三、两道题的共性总结 & 二刷收获

  1. 原地操作的核心思想:两道题都要求在不使用额外空间的情况下修改数组,核心都是通过双指针 / 多指针实现元素的交换和重排。
  2. 贪心算法的应用
    • 颜色分类:通过指针划分区域,一次遍历完成分类,局部最优(每次把元素放到正确位置)得到全局最优。
    • 下一个排列:通过 “找下降点、交换、反转” 三步,找到字典序下的最小更大排列,同样是贪心思想的体现。
  3. 面试高频考点
    • 颜色分类:重点考察三指针法和荷兰国旗问题,是多指针思想的经典应用。
    • 下一个排列:重点考察对排列字典序的理解和原地修改的技巧,面试中常被追问时间复杂度和空间复杂度优化。
http://www.jsqmd.com/news/748514/

相关文章:

  • 程序员也能看懂的古代天文历法:从《资治通鉴》里的“阏逢执徐”到现代农历算法
  • 告别Web界面!用Milvus CLI命令行工具高效管理向量数据库的5个实战场景
  • 轻量级多模态视觉语言模型Bunny:架构解析与实战指南
  • 医学影像分割新范式:提示工程与SAM模型实践
  • 2026年特殊儿童康复黄金期指南:儿童感统训练课程、前庭感统训练、发育迟缓儿童康复训练、孤独症儿童康复训练、家庭感统训练方法选择指南 - 优质品牌商家
  • 刷题避坑指南:搞定XTU-OJ上2048这类‘大模拟’题的通用思路
  • Vue 3项目从零到上线:除了npm install,你还需要配置这些(Node.js v22.4.1环境)
  • 从Audio2Photoreal代码实战出发:拆解FiLM如何让AI‘听声辨动作’
  • 基于规则的数据处理框架Preswald:声明式特征工程与数据转换实践
  • 从MySQL 5.7升级到8.1,我踩过的那些坑:MSI安装、环境变量与Navicat连接2059错误全解决
  • 2026成都气泡膜技术解析:珍珠棉酒托、电商专用气泡膜、电商快递气泡袋、四川气泡膜复合珍珠棉、四川珍珠棉、异形珍珠棉选择指南 - 优质品牌商家
  • YOLOv9涨点新思路:手把手教你用DySample替换上采样层(附训练配置文件详解)
  • 2026.02 飞书 V7.62 更新了哪些内容?多维表格默认布局一键恢复,仪表盘切片器支持文本搜索
  • 无我之刃,如何斩向“后世的实体”——论佛学对现代性“法执”的未预见
  • iTerm2隐藏玩法大揭秘:从窗口快照到按键回放,打造你的专属终端工作台
  • 视觉语言模型优化:视觉提示与网格分辨率实践指南
  • Python医疗影像调试最后的“黑箱”:NIfTI头文件校验、BIDS格式合规性、JSON侧车文件同步——这3个被99%开发者忽略的元数据断点
  • Android - Bitmap
  • 从模型到部署:手把手教你用Sophon SAIL在BM1684X上跑通第一个Python推理Demo
  • 别再瞎调YOLOv5的imgsz了!从640到1280,实测不同尺寸对训练速度和精度的真实影响
  • 保姆级教程:用PyTorch从零实现MAPPO算法(附完整代码与避坑指南)
  • HiFloat4:优化语言模型推理的4位块浮点格式
  • 大语言模型工程实战:从评估、结构化输出到安全部署的避坑指南
  • 手把手调参:基于海思PID源码,实战调试PMSM FOC双环(电流环+速度环)
  • 量子加密克隆技术:突破不可克隆定理的新方法
  • SSL剥离攻击入门:sslstrip工具快速上手指南
  • Sunshine游戏串流终极指南:三步搭建你的跨平台游戏服务器
  • 初创公司如何利用 Taotoken 低成本试错多种大模型
  • 飞书 V7.63 更新了哪些内容?AI 粘贴、AI 语音录入、AHA 电脑医生一次讲清楚
  • 2026电气防爆检测全指南:四川防爆检测公司/四川防雷检测公司/工厂防雷检测/工地防雷检测/成都防爆检测公司/成都防雷检测公司/选择指南 - 优质品牌商家