技巧

下一个排列

中等#31Java时间 O(n)空间 O(1)

题目要做什么

原地把数组改成按字典序排列的下一个排列。若当前已经最大,则改成最小排列。

题目示例输入nums = [1,2,3]
题目示例输出[1,3,2]

01 为什么这样做

从右寻找第一个上升位置 i,让它与右侧最小的更大值交换。右侧原本降序,再反转为升序,就得到增长幅度最小的下一排列。

始终成立的条件

找到 i 时,i 右侧的后缀为非递增序列;交换后反转使这个后缀最小。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public void nextPermutation(int[] nums) {3        int i = nums.length - 2;4        while (i >= 0 && nums[i] >= nums[i + 1]) i--;5        if (i >= 0) {6            int j = nums.length - 1;7            while (nums[j] <= nums[i]) j--;8            swap(nums, i, j);9        }10        int left = i + 1, right = nums.length - 1;11        while (left < right) {12            swap(nums, left++, right--);13        }14    }15    private void swap(int[] nums, int a, int b) {16        int temp = nums[a];17        nums[a] = nums[b];18        nums[b] = temp;19    }20}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索