leet刷题小菜鸡-47.全排列2

题目:

给定一个可包含重复数字的序列,返回所有不重复的全排列。

分析

相较于46题不含重复的简单全排列问题,较为复杂一些,具体针对树加了剪枝操作。剪枝分析见leetcode题解。谈一谈我的思路过程

backTrack() {
	//结束条件
	if(path not in res)
		res.push_back(path);
		return;
	//在这里我最开始的思路是判断path是否包含在res中,
	//但问题是这里较为复杂(毕竟是C艹不是PY)
}

答案

class Solution {
public:
    vector<vector<int>> res;
    vector<int> nums;
    vector<int> path;

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<bool> used (nums.size(), false);
        this->nums = nums;
        helper(used);
        return res;    
    }

    void helper(vector<bool>& used) {
        if(path.size() == nums.size()) {
            res.push_back(path);
            return;
        }

        for(int i=0; i < nums.size(); i++) {
        	//同级剪枝
            if(used[i] ||(i>0 && (!used[i-1]&&nums[i-1]==nums[i])))
                continue;
            path.push_back(nums[i]);
            used[i] = true;
            helper(used);
            path.pop_back();
            used[i] = false;
        }

        return;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法,c++)