全排列
题目描述
- 给定一个没有重复数字的序列,返回其所有可能的全排列。
- 示例:
输入: [1,2,3]
输出:
[ [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
代码
public static void main(String[] args) {
int[] a= {1,2,3,4,5};
ArrayList<ArrayList<Integer>> solve = solve(a);
System.out.println(solve);
}
private static ArrayList<ArrayList<Integer>> solve(int[] a) {
ArrayList<ArrayList<Integer>> resArrayList=new ArrayList<>();
ArrayList<Integer> tempArrayList=new ArrayList<>();
tempArrayList.add(a[0]);
resArrayList.add(tempArrayList);
for (int i=1 ;i<a.length;i++) {
ArrayList<ArrayList<Integer>> resArrayList2=new ArrayList<>();
for (ArrayList<Integer> ziji : resArrayList) {
for (int index = 0; index <= ziji.size(); index++) {
ArrayList<Integer> temp=new ArrayList<>();
temp.addAll(ziji);
temp.add(index,a[i]);
resArrayList2.add(temp);
}
}
resArrayList=resArrayList2;
}
return resArrayList;
}
按字典序第k个全排列
代码
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
String permutation = getPermutation(n, k);
System.out.println(permutation);
}
public static int f(int n){
int res=1;
for (int i = 1; i <=n ; i++) {
res=res*i;
}
return res;
}
public static String getPermutation(int n, int k) {
StringBuffer sb=new StringBuffer();
ArrayList<Integer> list=new ArrayList<Integer>();
for (int i = 1; i <=n; i++) {
list.add(i);
}
for (int i = 1;sb.length()<n ; i++) {
int interval=f(n-i);
int num;
if(k%interval==0){
num=k/interval-1;
}else{
num=k/interval;
}
sb.append(list.get(num));
list.remove(num);
Collections.sort(list);
k=k-num*interval;
}
return sb.toString();
}