1.从后往前找第一个满足num[i-1] < num[i]的索引i。
2.把num[i-1]和(i,n-1)中,比num[i-1]大的最小数交换。(从后往前找,交换后,(i,n-1)任然逆序)
3.nums[i]到nums[n-1]逆序排列。
public void swap(int []nums,int a,int b){
int tmp=nums[a];
nums[a]=nums[b];
nums[b]=tmp;
}
public void revers(int []nums,int start,int end){
for(int i=start;i<=(start+end)/2;i++) {
swap(nums,i,end-i+start);
}
}
public void nextPermutation(int[] nums) {
int len=nums.length;
int p=len-1;
while(p>0){
if(nums[p-1]<nums[p])
break;
p--;
}
if(p==0)
revers(nums,0,len-1);
else{
int q=len-1;
while(q>p-1){
if(nums[q]>nums[p-1])
break;
q--;
}
swap(nums,q,p-1);
revers(nums,p,len-1);
return;
}
}