Permutations II
Given 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]
.
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> opt = new ArrayList<List<Integer>>();
// edge case
if(num.length==0){return opt;}
// base case
List<Integer> firstLst = new ArrayList<Integer>();
firstLst.add(num[0]);
opt.add(firstLst);
// iteration
for(int i =1;i < num.length;i++){
HashSet<List<Integer>> visited = new HashSet<List<Integer>>();
int numOfLastOpt = opt.size();
for(int j = 0;j < numOfLastOpt;j++){
// insert new int into each valid gap
int positions = opt.get(j).size();
for(int u = 0;u <= positions;u++){
if(u != 0){
if(opt.get(j).get(u-1) != num[i]){
List<Integer> newLst = new ArrayList<Integer>(opt.get(j));
newLst.add(u,num[i]);
if(!visited.contains(newLst)){
opt.add(newLst);
visited.add(newLst);
}
}
}else{
List<Integer> newLst = new ArrayList<Integer>(opt.get(j));
newLst.add(u,num[i]);
if(!visited.contains(newLst)){
opt.add(newLst);
visited.add(newLst);
}
}
}
}
// delete previous opt
for(int j = 0;j < numOfLastOpt;j++){
opt.remove(0);
}
}
return opt;
}
}
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> opt = new ArrayList<List<Integer>>();
// edge case
if(num.length==0){return opt;}
// base case
List<Integer> firstLst = new ArrayList<Integer>();
firstLst.add(num[0]);
opt.add(firstLst);
// iteration
for(int i =1;i < num.length;i++){
HashSet<List<Integer>> visited = new HashSet<List<Integer>>();
int numOfLastOpt = opt.size();
for(int j = 0;j < numOfLastOpt;j++){
// insert new int into each valid gap
int positions = opt.get(j).size();
for(int u = 0;u <= positions;u++){
if(u != 0){
if(opt.get(j).get(u-1) != num[i]){
List<Integer> newLst = new ArrayList<Integer>(opt.get(j));
newLst.add(u,num[i]);
if(!visited.contains(newLst)){
opt.add(newLst);
visited.add(newLst);
}
}
}else{
List<Integer> newLst = new ArrayList<Integer>(opt.get(j));
newLst.add(u,num[i]);
if(!visited.contains(newLst)){
opt.add(newLst);
visited.add(newLst);
}
}
}
}
// delete previous opt
for(int j = 0;j < numOfLastOpt;j++){
opt.remove(0);
}
}
return opt;
}
}