题目1
给定数字的集合,返回所有可能的排列。 例如, [1,2,3]有以下排列: [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2]和[3,2,1]。
代码实现
/**
*回溯法求数组的全排列
*/
import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer>> permute(int[] num) {
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
if(num==null || num.length==0) return result;
ArrayList<Integer> list=new ArrayList<>();
int n=num.length;
boolean [] used=new boolean [n];
permute(num,n,used,list,result);
return result;
}
public void permute(int [] num,int n,boolean [] used,ArrayList<Integer> list,ArrayList<ArrayList<Integer>> result){
if(n==0){
ArrayList<Integer> temp=new ArrayList<>(list);
result.add(temp);
}else{
for(int i=0;i<num.length;i++){
if(!used[i]){
used[i]=true;
list.add(num[i]);
permute(num,n-1,used,list,result);
list.remove(list.size()-1);
used[i]=false;
}
}
}
}
}
题目2
给定可能包含重复项的数字集合,返回所有可能的唯一排列。 例如, [1,1,2]有以下独特的排列组合: [1,1,2],[1,2,1]和[2,1,1]。
代码实现
/**
*回溯法求数组全排列(包括去重)
*/
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
if(num==null || num.length==0) return result;
Arrays.sort(num);
int n=num.length;
ArrayList<Integer> list=new ArrayList<>();
boolean [] used=new boolean [n];
permuteUnique(num,n,used,list,result);
return result;
}
public void permuteUnique(int [] num,int k,boolean [] used,ArrayList<Integer> list,ArrayList<ArrayList<Integer>> result){
if(k==0){
ArrayList<Integer> temp=new ArrayList<>();
temp.addAll(list);
result.add(temp);
}else{
for(int i=0;i<num.length;i++){
if(!used[i]){
/**
*只需要判断i和i-1(而不需要判断i与i-2...) 相同的元素一定是相邻的。
*如果i-2,i-1,i相同,那么在上一轮循环就已经判断了i-1,i,本轮循环不需要重复判断
*/
if(i>0 && num[i]==num[i-1] && !used[i-1])
continue;
used[i]=true;
list.add(num[i]);
permuteUnique(num,k-1,used,list,result);
list.remove(list.size()-1);
used[i]=false;
}
}
}
}
}
题目1来自牛客网leetcode
题目2来自牛客网leetcode