vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> ret; permuteUnique(nums, 0, ret); return ret; }
void test() { vector<int> num = { 1, 1, 2, 2, 2 }; vector<vector<int>> result = permuteUnique(num); for (auto v : result) { for (int x : v) { cout << x << ' '; } cout << endl; } }
vector<vector<int> > permuteUnique(vector<int> &num) { int n = num.size(); vector<vector<int> > ans; if(n == 0) return ans; vector<bool> visited(n); vector<int> cur; sort(num.begin(), num.end()); permuteUnique(num, visited, cur, ans); return ans; }
vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int>> v; vector<int> r; map<int, int> map; for (int i : num) { if (map.find(i) == map.end()) map[i] = 0; map[i]++; } permuteUnique(v, r, map, num.size()); return v; }
void test() { int A[] = {1, 1, 2}; vector<int> num(A, A + 3); vector<vector<int> > res = permuteUnique(num); for(int i = 0; i < (int)res.size(); i++) { for(int j = 0; j < (int)res[i].size(); j++) { cout << res[i][j] << " "; } cout << endl; } }
int main() { int nums[] = { -1, 2, -1, 2, 1, -1, 2, 1 }; int returnSize; int **ans = permuteUnique(nums, sizeof(nums) / sizeof(int), &returnSize); int i, j; for (i = 0; i < returnSize; ++i) { for (j = 0; j < sizeof(nums) / sizeof(int); ++j) { printf("%d ", ans[i][j]); } printf("\n"); } system("pause"); return 0; }
//pass by value void permuteUnique(vector<int> nums, int beg, vector<vector<int>> &ret) { if (beg == nums.size()) { ret.push_back(nums); return; } for (int i = beg; i < nums.size(); ++i) { if (i != beg && nums[i] == nums[beg]) continue; swap(nums[i], nums[beg]); permuteUnique(nums, beg + 1, ret); } }
void SubSetTest::testPermutateUnique( void ) { vector<int> testVec; int myarray[] = { 1, 2, 2 }; testVec.insert (testVec.begin(), myarray, myarray+3); vector<vector<int>> rst = permuteUnique( testVec ); for (int i = 0; i < rst.size(); ++i) { for (int j = 0; j < rst[i].size(); ++j) { cout<<rst[i][j]<<" "; } cout<<endl; } }
void permuteUnique(vector<int> &num, vector<bool> &visited, vector<int> &cur, vector<vector<int> > &ans){ int n = num.size(); if(cur.size() == n) { ans.push_back(cur); return; } for(int i=0; i<n; i++) { if(visited[i] || i!=0 && num[i]==num[i-1] && visited[i-1]) continue; cur.push_back(num[i]); visited[i] = true; permuteUnique(num, visited, cur, ans); cur.pop_back(); visited[i] = false; } }
void permuteUnique(vector<vector<int>> &v, vector<int> &r, map<int, int> &map, int n) { if (n <= 0) { v.push_back(r); return; } for (auto &p : map) { if (p.second <= 0) continue; p.second--; r.push_back(p.first); permuteUnique(v, r, map, n - 1); r.pop_back(); p.second++; } }
vector<vector<int> > permuteUnique(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > result; int n = num.size(); vector<vector<int> > tryed; if (n==1) { vector<int > one; one.push_back(num[0]); result.push_back(one); return result; } for (int i=0; i<n; i++) { int one = num[i]; vector<int> tmp_num ; vector<int> one_try; one_try.push_back(one); for (int j=0; j<n; j++) { if (j != i) { tmp_num.push_back(num[j]); one_try.push_back(num[j]); } } vector<vector<int> >::iterator it; it = find(tryed.begin(), tryed.end(), one_try); if (it != tryed.end() ) { continue; } else { tryed.push_back(one_try); } vector<vector<int> > tmp_result = permuteUnique(tmp_num); for (int j=0; j<tmp_result.size(); j++) { tmp_result[j].insert(tmp_result[j].begin(), one); vector<vector<int> >::iterator it; it = find(result.begin(), result.end(), tmp_result[j]); if (it == result.end()) result.push_back(tmp_result[j]); } } return result; }