【LeetCode热题100(94/100)】下一个排列

题目地址: 链接

找规律:从数组末尾开始向左查找第一个无法构成逆序的位置。将该元素与后续数组中大于它的最小值交换,此时后续数组仍保持逆序状态,最后将这部分数组翻转即可完成排序(代码为sort排序)。

js 复制代码
/*
 * @lc app=leetcode.cn id=31 lang=typescript
 *
 * [31] 下一个排列
 */

// @lc code=start
/**
 Do not return anything, modify nums in-place instead.
 */
function nextPermutation(nums: number[]): void {
    const n = nums.length;
    for(let i = n - 1; i > 0; i --) {
        if(nums[i] > nums[i - 1]) {
            let [flag, flagIdx] = [Infinity, i];
            for(let j = i; j < n; j ++) {
                if(nums[j] > nums[i - 1] && nums[j] < flag) {
                    flagIdx = j;
                    flag = nums[j];
                }
            }

            // subArr是一个有序数组,可以直接反转数组弄成有序数组
            [nums[flagIdx], nums[i - 1]] = [nums[i - 1], nums[flagIdx]];
            let subArr = nums.slice(i, n).sort((a, b) => a - b);
            nums.splice(i, n - i, ...subArr);
            return
        }
    }
    for(let i = 0; i < (n >> 1); i ++) {
        [nums[i], nums[n - i - 1]] = [nums[n - i - 1], nums[i]]; 
    }
};

// @lc code=end
相关推荐
小欣加油6 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly6 小时前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕7 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei7 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld8 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi89 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang10 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby11 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠12 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力12 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试