LeetCode 47. Permutations II
Solution1:我的答案
笨蛋方法:和第46题的思路差不多,把vector换成了set就OK啦~~~
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
set<vector<int> > res;
vector<vector<int> > my_res;
vector<int> temp_res;
if(nums.size() == 0)
return my_res;
else if(nums.size() == 1) {
my_res.push_back(nums);
return my_res;
}
int level = 0;
vector<bool> visited(nums.size(), false);
my_DFS(nums, res, temp_res, visited, level);
return vector<vector<int> > (res.begin(), res.end());
}
void my_DFS(vector<int>& nums, set<vector<int> >& res,
vector<int>& temp_res, vector<bool>& visited, int level) {
if(level == nums.size()) {
res.insert(temp_res);
return;
}
else {
for(int i = 0; i < nums.size(); i++) {
if(!visited[i]) {
temp_res.push_back(nums[i]);
visited[i] = true;
my_DFS(nums, res, temp_res, visited, level + 1);
temp_res.pop_back();
visited[i] = false;
}
}
}
}
};
Solution2:
参考网址:[1]http://www.cnblogs.com/grandyang/p/4359825.html
[2]https://www.cnblogs.com/reboot329/p/6053808.html
【链接2讲的比较明白】还是DFS,不过有重复,那重点就是去重了。
同样深度的情况下,出现重复的,那么需要跳过。 具体说就是:
判断是否和上一个相等,相等的情况下如果上一个没用过,说明是上一个回溯结束的,同一层,那么就不要再重新来一轮了,跳过。 112 分别以1,1,2开始,第二个1,和第一个1开始的结果重复的。
在第一个1开始的时候,下一层的当前元素是第二个1,虽然也是1,但是上一个1被用了,说明它是不同深度的,所以不跳过。
这道题是之前那道 Permutations 全排列的延伸,由于输入数组有可能出现重复数字,如果按照之前的算法运算,会有重复排列产生,我们要避免重复的产生,在递归函数中要判断前面一个数和当前的数是否相等,如果相等,前面的数必须已经使用了,即对应的visited中的值为1,当前的数字才能使用,否则需要跳过,这样就不会产生重复排列了,代码如下:
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int> > res;
vector<int> out;
vector<int> visited(num.size(), 0);
sort(num.begin(), num.end());
permuteUniqueDFS(num, 0, visited, out, res);
return res;
}
void permuteUniqueDFS(vector<int> &num, int level, vector<int> &visited, vector<int> &out, vector<vector<int> > &res) {
if (level >= num.size()) res.push_back(out);
else {
for (int i = 0; i < num.size(); ++i) {
if (visited[i] == 0) {
if (i > 0 && num[i] == num[i - 1] && visited[i - 1] == 0) continue;
visited[i] = 1;
out.push_back(num[i]);
permuteUniqueDFS(num, level + 1, visited, out, res);
out.pop_back();
visited[i] = 0;
}
}
}
}
};