【DFS 回溯】46. 全排列 47. 全排列 II

注意是对原数组进行交换!!!

class Solution {
public:
    void dfs(vector<int>& nums, int index){
        if(index == num_len){
            result.push_back(nums);
            return;
        }    
        for(int i=index; i<num_len; ++i){
            swap(nums[index], nums[i]);
            dfs(nums, index + 1);
            swap(nums[index], nums[i]);
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        num_len = nums.size();
        dfs(nums, 0);
        return result;
    }
private:
    int num_len;
    vector<vector<int>> result;
};

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
添加一个排序和去重步骤,有上一题方法二修改而来。

class Solution {
public:
    void dfs(vector<int> nums, int index){
        if(index == num_len){
            result.push_back(nums);
            return;
        }    
        for(int i=index; i<num_len; ++i){
            if(i!=index && nums[index] == nums[i]) continue;
            swap(nums[index], nums[i]);
            dfs(nums, index + 1);
        }
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        num_len = nums.size();
        sort(nums.begin(), nums.end());
        dfs(nums, 0);
        return result;
    }
private:
    int num_len;
    vector<vector<int>> result;
};
posted @ 2022-03-01 16:24  fwx  阅读(23)  评论(0)    收藏  举报