【数字全排列】LeetCode 47. Permutations II

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;
                }
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值