Permutations
Total Accepted: 7785 Total Submissions: 25366Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:
[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
Permutations II
Total Accepted: 5329 Total Submissions: 21643Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
, and [2,1,1]
.
Similar problems: combination, combination sum I & II, subsets I&II
all using recursive way. find one possible branch and then turn to another branches
For example. [1, 2, 3, 4]
1 2 3 4
/ | \
2 3 4
/ \ / \ / \
3 4 2 4 2 3
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
int len = num.length;
ArrayList<ArrayList<Integer>> ret = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> element = new ArrayList<Integer>();
boolean[] find = new boolean[len];
if (num == null){
return null;
}
if(len == 1){
ArrayList<Integer> rr = new ArrayList<Integer>();
rr.add(num[0]);
ret.add(rr);
// return ret;
}
else{
Arrays.sort(num);
getPer(num,ret,element,find);
}
return ret;
}
public void getPer(int[] num, ArrayList<ArrayList<Integer>> ret,
ArrayList<Integer> element, boolean[] find){
if(element.size() == num.length){
ret.add((ArrayList<Integer>)element.clone()); //important
return;
}
else{
for(int i=0;i<num.length;i++){
if(find[i]==false){
find[i] = true;
element.add(num[i]);
getPer(num, ret, element,find);
// important//
int j = element.size()-1;
element.remove(j);
find[i] = false;
// for permutation II to remove duplicate
while (i+1<num.length && num[i]==num[i+1]) {
i++;
}
}
}
}
// return ret;
}
}