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

LeetCode-031:下一个排列,从右往左找“转折点”,再反转后缀

本题在线练习:LeetCode 31. 下一个排列 - 在线练习(免费 · 无需登录 · AI 辅助)(https://onefly.top/zero2Leetcode/playground.html?id=31)

配套刷题网站 Zero2Leetcode —— 内置本地 OJ + AI 教练,零门槛开始刷 Hot 100。

题目概述

给定一个整数数组 nums,将其重新排列成“字典序”下一个更大的排列。如果不存在更大的排列(已经是最大排列),则变成最小排列(升序)。

要求 原地修改,额外空间 O(1)

核心思路:下一个排列只需要“动最右边能动的地方”

字典序的规则是:越靠左的位置越重要,想得到“刚好大一点”的排列,应该尽量让左侧保持不变,只在右侧做最小改动。

步骤(经典三步):

  1. 从右往左找第一个位置 i,满足 nums[i] < nums[i+1],这叫“转折点/下降点”的前一个位置。
  2. 如果找到了 i,再从右往左找第一个 j,满足 nums[j] > nums[i],交换 nums[i]nums[j]
  3. i+1 到末尾这一段 反转(因为这一段原本是非递增的,反转后变成最小的升序后缀)。

如果第 1 步找不到 i,说明整个数组是非递增的,已经是最大排列,直接整体反转得到最小排列。

代码实现(原地)

class Solution:def nextPermutation(self, nums: list[int]) -> None:n = len(nums)# 1) find pivot: first i from right with nums[i] < nums[i+1]i = n - 2while i >= 0 and nums[i] >= nums[i + 1]:i -= 1if i >= 0:# 2) find rightmost j with nums[j] > nums[i]j = n - 1while nums[j] <= nums[i]:j -= 1nums[i], nums[j] = nums[j], nums[i]# 3) reverse suffix i+1..endl, r = i + 1, n - 1while l < r:nums[l], nums[r] = nums[r], nums[l]l += 1r -= 1

逐行拆解:为什么后缀要“反转”

在第 1 步找到的 i,意味着 i+1..end 这一段是 非递增 的:

... nums[i] < nums[i+1] >= nums[i+2] >= ... >= nums[n-1]

想让整体“刚好大一点”,把 nums[i] 换成后缀里“比它大一点点”的元素(第 2 步取最右的那个),然后让后缀变成最小可能(升序)。

由于后缀本来是非递增的,最省事的升序方式就是直接反转。

手动模拟:nums = [1,2,3]

  • i2 < 3,所以 i=1
  • j:从右找第一个 >2 的是 3,交换得到 [1,3,2]
  • 反转后缀(位置 2 到末尾)不变

答案 [1,3,2]

再看最大排列 [3,2,1]

  • 找不到 i(全程非递增)
  • 直接反转得到 [1,2,3]

复杂度分析

  • 时间:O(n)(最多三趟线性扫描/交换)
  • 空间:O(1)

总结

下一个排列的关键是“最右侧最小改动”:

  1. 找转折点 i
  2. 在右侧找最合适的 j 交换
  3. 反转后缀得到最小后缀

掌握这三步,基本不会写错。

http://www.jsqmd.com/news/541451/

相关文章:

  • debian 更新内核后,nvidia 驱动突然不见了,处理
  • 基于springboot的志愿者招募管理系统
  • springboot框架的的网上烘焙蛋糕商城销售系统-vue
  • 终极免费CAJ转PDF工具:caj2pdf完整使用指南
  • LeetCode-287:寻找重复数,把数组看成“指针图”,用 Floyd 判环
  • 零门槛AI视频增强:3阶段提速3倍的Squirrel-RIFE实战指南
  • 二分查找/二分答案
  • 蒙纳什大学发现多模态推理模型的“不确定性陷阱“
  • 2026钢模板租赁优质厂家精选指南 - 优质品牌商家
  • 基于主从博弈的主动配电网阻塞管理探索
  • The Dark Art of Low-Light Enhancement: Why Retinex Models Don’t Need Handcrafted Priors Anymore
  • OpenClaw自动化测试:Qwen3-32B批量执行LeetCode题目
  • STM32开发中的C语言高效编程技巧
  • 禾赛与华为拿下七成市场,激光雷达“抢单大战”谁在掉队?
  • LeetCode-041:缺失的第一个正数,把数组当哈希表,原地放回“该在的位置”
  • 使用小龙虾来操作猿编程的遥控车
  • 02.Linux常用文件操作命令
  • Python MCP协议实战指南:深度解析RFC-8888兼容实现与5大核心中间件集成(附GitHub Star 1.2k模板库)
  • 魔兽争霸III终极优化指南:WarcraftHelper插件完全使用教程
  • BMH23M001 24位Σ-Δ ADC模块技术解析与高精度测量实践
  • 【华为OD机试真题】伐木工 · 木材切割收益最大化问题(C语言)
  • 给 Agent 添加工具调用能力:搜索/计算/API
  • Nimbus:一个统一的具身合成数据生成框架
  • 2026年点胶机厂家权威推荐榜:视觉点胶机/非标灌胶机定制/非标点胶机定制/高精度灌胶机/高精度点胶机/选择指南 - 优质品牌商家
  • AMBER新手入门:5步搞定分子动力学模拟(附ff14SB力场配置指南)
  • FFmpeg 中编译和使用 soxr 重采样引擎
  • 嵌入式OLED UI组件库:轻量级C++组件化设计
  • C++ Template 特化机制详解
  • SEO_掌握核心算法,解读SEO排名背后的原因
  • 上海小程序开发公司三项测评:报价透明度,交付准时率,售后响应度