if(i>0 &&nums[i-1]==nums[i] && !used[i-1]) continue; // 이해하기
이미 뽑았던것은 당연히 뽑지 않는다.
안뽑은 나머지 수들 중 중복되는수을 뽑지 않으면서 조합을 만든다.
class Solution {
private:
vector<vector<int>> res;
public:
void makePermutation(vector<int> &temp,vector<int> &pickCheck, const vector<int>& nums){
//다뽑은 경우의수
if(temp.size()==nums.size()){
res.push_back(temp);
return;
}
//현재 뽑았던 수중에 중복되는 수는 뽑지 않는다.
bool dupCheck[21];
fill_n(dupCheck,21,false);
//이미 뽑았던 인덱스(pickCheck)는 뽑지 않는다.
//나머지는 뽑아도된다.
for(int i = 0; i < nums.size(); i++){
if(!dupCheck[nums[i]+10]&&!pickCheck[i]){
dupCheck[nums[i]+10] = true;
pickCheck[i] = 1;
temp.push_back(nums[i]);
makePermutation(temp, pickCheck, nums);
temp.pop_back();
pickCheck[i] = 0;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<int>temp;
vector<int>pickCheck(nums.size(),0);
makePermutation(temp,pickCheck, nums);
return res;
}
};
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums==null || nums.length==0) return res;
boolean[] used = new boolean[nums.length];
List<Integer> list = new ArrayList<Integer>();
Arrays.sort(nums);
dfs(nums, used, list, res);
return res;
}
public void dfs(int[] nums, boolean[] used, List<Integer> list, List<List<Integer>> res){
if(list.size()==nums.length){
res.add(new ArrayList<Integer>(list));
return;
}
for(int i=0;i<nums.length;i++){
if(used[i]) continue;
if(i>0 &&nums[i-1]==nums[i] && !used[i-1]) continue;
used[i]=true;
list.add(nums[i]);
dfs(nums,used,list,res);
used[i]=false;
list.remove(list.size()-1);
}
}
}