题目
思路
- 题解
- 第一点:我们应该经历操作低位的数而不应该操作高位的数
- 第二点:从后往前找到第一个非升序的数m,这样就可以从后面那一个中取一个最小但是比m大的进行交换,确保交换的数比原来的大。
- 第三点:由于m后面数从后往前看是升序的,直接反转就能得到最小的数据,但是又比原来大。
最后需要注意判断全为降序情况,因此我们初始值要特殊处理为-1,方便判断这种情况,就不用进行第二步操作
代码
public void nextPermutation(int[] nums) {if (nums.length == 0) return;int index = -1; //置为-1是为了判断哪些刚好全部降序情况//1.从后往前找到第一个非升序的mfor (int i = nums.length - 2; i >= 0; i--) {if (nums[i] < nums[i + 1]) {index = i;break;}}//2.从后往前找到第一个比m大的n,然后交换for (int i = nums.length - 1; i >= 0 && index >= 0; i--) {if (nums[i] > nums[index]) {swap(i, index, nums);break;}}//3.将m位置后面的数反转for (int i = index + 1, j = nums.length - 1; i < j; i++, j--) {swap(i, j, nums);}}private void swap(int i, int j, int[] nums) {int t = nums[i];nums[i] = nums[j];nums[j] = t;}
