class Solution {
public void nextPermutation(int[] nums) {
int index=-1;
for(int i=nums.length-1;i>0;i--){
if(nums[i]>nums[i-1]){
index=i-1;
break;
}
}
if(index==-1){
// 最后一个排列
Arrays.sort(nums);
return;
}
// 找到index右边比他大的数中最小的
int t=-1; // 该数的index
int tmin=Integer.MAX_VALUE;
for(int i=nums.length-1;i>index;i--){
if(nums[i]>nums[index]){
if(nums[i]<tmin){
tmin=nums[i];
t=i;
}
}
}
int s=nums[t];
nums[t]=nums[index];
nums[index]=s;
Arrays.sort(nums,index+1,nums.length);
}
}
凡是觉得不太懂的都发一篇:
根据next permutation的规则,从后往前扫描,看有没有后面大于前面的,比如123,那么3>2
然后在上述一对数中较小的一个右边找一个大于他,但是最小的,如132,3>1,但是不是把3,1交换,而是2,1交换,得到231
然后将原来1所在位置的右边进行排序,得到213