之前一直用c++的next_permutation函数,也不知道其中的原理,所以用这个题来学习下。
全排列中前一个数一定小于后面的那个数,所以我们只需找到比当前这个数大,但是要尽量让他大的幅度最小
我们从最后一个数开始遍历,找到一个比后面一个数小的数,记为i,然后再从最后遍历找到一个比前面一个数小的数,记为j,交换i与j。这时候还没结束,交换后,在i后的几位数要保证是升序排列,这样才能保证大的幅度最小
class Solution {
public void nextPermutation(int[] nums) {
int i = nums.length-2;
int j = nums.length-1;
while(i>=0&&nums[i]>=nums[i+1])
i--;
if(i>=0){
while(j>=0&&nums[i]>=nums[j])
j--;
swap(nums,i,j);
}
reverse(nums,i+1);
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public void reverse(int[] nums, int begin) {
int l = begin;
int r = nums.length-1;
while(l<r){
swap(nums,l,r);
l++;
r--;
}
}
}