LeetCode 47 Permutations II (C++, Python)
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]
.Solution C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Solution { void gp(vector<int>& num, vector<bool>& visited, vector<int>& mystack, vector<vector<int>>& ret) { if (mystack.size() == num.size()) { ret.push_back(mystack); return; } for (int i = 0; i < num.size(); ++i) { if (visited[i]) continue; if ((i > 0) && (num[i] == num[i - 1]) && (!visited[i - 1])) continue; visited[i] = true; mystack.push_back(num[i]); gp(num, visited, mystack, ret); mystack.pop_back(); visited[i] = false; } } public: vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int>> ret; if (num.size() == 0) return ret; sort(num.begin(), num.end()); vector<bool> visited(num.size(), false); vector<int> mystack; gp(num, visited, mystack, ret); return ret; } }; |
Solution Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Solution: def gp(self, num, visited, mystack, ret): if len(mystack) == len(num): ret.append(mystack[:]) return for i in range(len(num)): if visited[i]: continue if (i > 0) and (num[i] == num[i - 1]) and (not visited[i - 1]): continue visited[i] = True mystack.append(num[i]) self.gp(num, visited, mystack, ret) mystack.pop() visited[i] = False # @param num, a list of integer # @return a list of lists of integers def permuteUnique(self, num): ret = [] if not num: return ret num.sort() visited = [False] * len(num) mystack = [] self.gp(num, visited, mystack, ret) return ret |