这道题的思路是从数组倒着查找,找到nums[i] 比nums[i+1]小的时候,就将nums[i]跟nums[i+1]到nums[nums.length - 1]当中找到一个最小的比nums[i]大的元素交换。交换后,再把nums[i+1]到nums[nums.length-1]排序,就ok了
public void nextPermutation(int[] nums) {
int i = nums.length-2;
while(i>=0&&nums[i+1]<=nums[i]){ //这一步是从数组后面开始排序,检验是否从右边往左边从小到大的排序,如果不是则跳出这个循环,只在开头的时候执行一次,跳出的这个数i则表示是要找的那个数,从这个i右边已经排序好的数字开始在进行倒序。
i--;
}
if(i>=0){
int j=nums.length-1;
while(j>=0&&nums[j]<=nums[i]){
j--;
}
swap(nums,i,j);
}
reverse(nums,i+1);
}
private void reverse(int[] nums,int start){
int i = start,j = nums.length-1;
while(i<j){
swap(nums,i,j);
i++;
j--;
}
}
private void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}