按照字典序依次写,求一个序列的下一字典序序列:
A[0] A[1] A[2] A[3] A[4] A[5]...A[n-1](1 2 3 7 10 9 8 6 5)
从后往前找到第一个相邻的顺序:A[i-1]<A[i](7, 10),然后从后往前找第一个A[k]>A[i-1](8)
交换A[k]与A[i-1](1 2 3 8 10 9 7 6 5)
然后把A[i]到A[n-1]颠倒(1 2 3 8 5 6 7 9 10)
就得到原来序列的下一个字典序序列了。
这一思路对有无相同元素都适用,同一代码可以A Permutations/Permutations II 两个题。
public class Solution {
public static ArrayList<ArrayList<Integer>> permute(int[] num) {
Arrays.sort(num);
ArrayList<ArrayList<Integer>> rstlist=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> rstele=null;
int n=num.length;
int i,j,k,swap;
rstele=new ArrayList<Integer>();
for(i=0;i<n;i++)
rstele.add(num[i]);
rstlist.add(rstele);
while(true)
{
for(i=n-1;i>0;i--)
if(num[i]>num[i-1])
break;
if(i==0)
break;
j=i-1;
//System.out.println(i+" "+j+" "+" ");
for(k=n-1;k>=j;k--)
if(num[k]>num[j])
break;
swap=num[j];
num[j]=num[k];
num[k]=swap;
reverse(num,i);
rstele=new ArrayList<Integer>();
for(i=0;i<n;i++)
rstele.add(num[i]);
rstlist.add(rstele);
}
return rstlist;
}
public static void reverse(int[] num,int i)
{
int l=i,r=num.length-1;
int swap;
while(l<r)
{
swap=num[l];
num[l]=num[r];
num[r]=swap;
l++;
r--;
}
}
}