problem:
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]
.
thinking:
(1)采用DFS,对已经访问过的元素标识
(2)考虑去重:对于重复的数字,规定一个访问顺序即可
先对数组进行排序,这样在DFS的时候,可以先判断前面的一个数是否和自己相等,相等的时候则前面的数必须使用了,自己才能使用,这样就不会产生重复的排列了。
code:
class Solution { private: bool canUse[100]; int a[100]; vector<vector<int> > ret; public: void dfs(int dep, int maxDep, vector<int> &num) { if (dep == maxDep) { vector<int> ans; for(int i = 0; i < maxDep; i++) ans.push_back(a[i]); ret.push_back(ans); return; } for(int i = 0; i < maxDep; i++) if (canUse[i]) { if (i != 0 && num[i] == num[i-1] && canUse[i-1]) continue; canUse[i] = false; a[dep] = num[i]; dfs(dep + 1, maxDep, num); canUse[i] = true; } } vector<vector<int> > permuteUnique(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(num.begin(), num.end()); memset(canUse, true, sizeof(canUse)); ret.clear(); dfs(0, num.size(), num); return ret; } };
leetcode || 47、 Permutations II
原文地址:http://blog.csdn.net/hustyangju/article/details/44752497