【Golang】LeetCode 31. 下一个排列

31. 下一个排列

题目描述

思路

这道题目已经不是第一次在我的频道出现了😂,但是时隔过久没有刷题,又忘记了思路,在此重新记录一次。

寻找下一个排列,也就是寻找下一个比当前稍大的组合。我们要做的就是从后往前首先找到一个"可提升的位置",也就是从后往前寻找一个"谷值"。如果从后往前我们不能找到一个位置满足nums[i] < nums[i + 1],这就说明当前数组已经是降序排列了,也就是"最后一个排列",直接将整个数组翻转,就可以得到下一个排列(比如[3, 2, 1],下一个排列就是[1, 2, 3])。

如果我们能够找到谷值,接下来我们需要做的就是"提升这个位置的大小"。一个很直观的想法就是:我们再次从后向前,找到第一个比nums[i]要大的数,满足nums[i] < nums[j],j这个位置的数就是我们要与i交换的数,交换之后可以立马提升i位置的大小。

不过到此还没有结束,以[4, 5, 6, 1, 3, 2]这个比较复杂的排列为例,显然nums[i] == 1; nums[j] == 2。如果单纯交换两个位置的数,得到[4, 5, 6, 2, 3,1],并不是下一个排列,显然[4, 5, 6, 2, 1, 3]比[4, 5, 6, 2, 3, 1]更小。所以我们在交换nums[i]和nums[j]的数值之和,还需要显式地对区间[i + 1, n)进行一次翻转,以确保i位置之后的字典序最小。

至此,我们得到的序列就是输入序列的「下一个排列」。

Golang 题解

go 复制代码
func nextPermutation(nums []int)  {
    n := len(nums)
    i := n - 2
    // 首先找到一个"可提升的位置". 对于 [4, 5, 6, 1, 3, 2] 这个例子
    // 可提升的位置就是 1, 因为 1 < 3
    for i >= 0 {
        if nums[i] < nums[i + 1] {
            break
        }
        i --
    }
    // 如果找不到可提升的位置, 也就是最终 i < 0, 说明整个数组从前往后
    // 单调递减, 此时已经是最后一个排列, 直接反转整个数组得到下一个排列
    if i >= 0 {
        // 否则, 找到了一个可提升的位置, 此时从后到 i 寻找一个
        // 比 i 大的数值 j
        j := n - 1
        for nums[i] >= nums[j] {
            j --
        }
        // 交换 i, j 下标对应的这两个数
        // [4, 5, 6, 1, 3, 2] -> [4, 5, 6, 2, 3 ,1]
        // 但此时仍然不是下一个排列, 应该翻转 [i + 1, n) 这个区间
        // [4, 5, 6, 2, 1, 3] 才是 [4, 5, 6, 1, 3, 2] 的下一个排列
        nums[i], nums[j] = nums[j], nums[i]
    }
    for k, t := i + 1, n - 1; k < t; k, t = k + 1, t - 1 {
        nums[k], nums[t] = nums[t], nums[k]
    }
}
相关推荐
黄金龙PLUS2 分钟前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
心中有你021412 分钟前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
Omics Pro1 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
UIU1144 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
用户979984807189 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks9 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea9 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术9 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术9 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户0441440924499 小时前
卫星信号模拟器里的四个坐标转换公式
算法