题解 | #有重复项数字的所有排列#

有重复项数字的所有排列

http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

回溯法,求排列的问题在回溯函数中需要用到used标记数组,同时还需要进行去重。去重的方法有两种,一种是在递归返回条件的地方,判断结果集中是否已存在path;另一种是在回溯是判断,对于一排序的序列num,如果后面的元素与前面的元素重复,则只使用前面的第一个元素。

class Solution {
public:
    void backtrack(const vector<int>& num,vector<bool>& used,vector<vector<int>>& result,vector<int>& path){
        if(path.size()==num.size()){
            if(!count(result.begin(),result.end(),path)) result.push_back(path);
        }
        for(int i=0;i<num.size();i++){
            //if(i > 0 && num[i] == num[i - 1] && used[i - 1] == false) continue;
            if(!used[i]){
                used[i]=true;
                path.push_back(num[i]);
                backtrack(num, used, result, path);
                path.pop_back();
                used[i]=false;
            }
            else continue;
        }
    }
    
    vector<vector<int> > permuteUnique(vector<int> &num) {
        sort(num.begin(),num.end());
        int n=num.size();
        vector<vector<int>> result{};
        vector<int> path{};
        vector<bool> used(n, false);
        backtrack(num, used, result, path);
        return result;
    }
};





全部评论

相关推荐

11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
点赞 评论 收藏
分享
整顿职场的柯基很威猛:这种不可怕,最可怕的是夹在一帮名校里的二本选手,人家才是最稳的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务