1.解法:
在当前序列中,从尾端往前寻找两个相邻元素,前一个记为first,后一个记为second,并且满足first 小于 second。然后再从尾端寻找另一个元素number,如果满足first 小于number,即将第first个元素与number元素对调,并将second元素之后(包括second)的所有元素颠倒排序,即求出下一个序列
example:
6,3,4,9,8,7,1
此时 first = 4,second = 9
从尾巴到前找到第一个大于first的数字,就是7
交换4和7,即上面的swap函数,此时序列变成6,3,7,9,8,4,1
再将second=9以及以后的序列重新排序,让其从小到大排序,使得整体最小,即reverse一下(因为此时肯定是递减序列)
得到最终的结果:6,3,7,1,4,8,9
class Solution {
public void nextPermutation(int[] nums) {
int sign1=-1;
for(int i=nums.length-1;i>0;i--){
if(i>0){
if(nums[i-1]<nums[i]){
sign1=i-1;
break;
}
}
}
if(sign1==-1){
for(int i=0;i<nums.length/2;i++){
int temp=nums[i];
nums[i]=nums[nums.length-1-i];
nums[nums.length-1-i]=temp;
}
}else{
int sign2=-1;
for(int i=nums.length-1;i>sign1;i--){
if(nums[sign1]<nums[i]){
sign2=i;
break;
}
}
int temp=nums[sign1];
nums[sign1]=nums[sign2];
nums[sign2]=temp;
sort(nums,sign1+1,nums.length-1);
}
}
public static void sort(int[] a,int start,int end){
if(start<end){
Arrays.sort(a,start,end+1);
}
}
}