leetcode 47全排列II(树层去重和树枝去重)

简介: leetcode 47全排列II(树层去重和树枝去重)

全排列


c52ae9d0ff024fd789f8dd8f667e8477.png

回溯标记法(不去重,时间复杂度高)

在插入之前做一个find查找,找不到相同的插入

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums , vector<bool>& used)
    {
        if(path.size() == nums.size())
        {
            if(find(result.begin() , result.end() , path) == result.end() ) result.push_back(path);
            return;
        }
        for(int i=0 ; i<nums.size() ;i++)
        {
            if(used[i] == 1) continue;
            used[i]=1;
            path.push_back(nums[i]);
            backtracking(nums,used);
            path.pop_back();
            used[i]=0;
        }
        return;
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<bool> used(nums.size(),false);
        backtracking(nums,used);
        return result;
    }
};
返回该题
力扣 LeetCode


回溯去重

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking (vector<int>& nums, vector<bool>& used) {
        // 此时说明找到了一组
        if (path.size() == nums.size()) {
            result.push_back(path);
            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            // used[i - 1] == true,说明同一树枝nums[i - 1]使用过
            // used[i - 1] == false,说明同一树层nums[i - 1]使用过
            // 如果同一树层nums[i - 1]使用过则直接跳过
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false) //去重
            {
                continue;
            }
            if (used[i] == false) {
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        result.clear();
        path.clear();
        sort(nums.begin(), nums.end()); // 排序
        vector<bool> used(nums.size(), false);
        backtracking(nums, used);
        return result;
    }
};

树层去重

if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false)
{
    continue;
}


8196a6683e1f4643a060f04e8cf976d1.png

树枝去重

if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true)
{
    continue;
}

a1fd22df6b544c8895b8034a63e75c04.png


二刷

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    vector<bool> underNum;
    void track_back(vector<int>& nums )
    {
        if(path.size() >= nums.size())
        {
            result.push_back(path);
            return;
        }
        for(int i=0 ; i<nums.size();i++)
        {
            if(underNum[i]==true)continue;
            if(i>0&&nums[i]==nums[i-1]&&underNum[i-1]==false) continue;
            underNum[i] = true;
            path.push_back(nums[i]);
            track_back(nums);
            path.pop_back();
            underNum[i] = false;
        }
        return;
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        if(nums.size() == 0 ) return result;
        sort(nums.begin(),nums.end());
        underNum.assign(nums.size(),false);
        track_back(nums);
        return result;
    }
};
相关文章
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
58 4
|
3月前
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
44 0
Leetcode第46题(全排列)
|
3月前
Leetcode第47题(全排列II)
LeetCode第47题要求返回一个包含重复数字序列的所有不重复全排列,通过深度优先搜索和去重策略来解决。
34 0
|
5月前
|
算法
LeetCode第46题全排列
LeetCode第46题"全排列"的解题方法,利用回溯法避免重复并确保元素的有序性,生成所有可能的排列组合。
LeetCode第46题全排列
|
5月前
|
Python
【Leetcode刷题Python】538. 把二叉搜索树转换为累加树
LeetCode上538号问题"把二叉搜索树转换为累加树"的Python实现,使用反向中序遍历并记录节点值之和来更新每个节点的新值。
28 3
|
5月前
|
算法
LeetCode第47题全排列II
LeetCode第47题"全排列II"的解题方法,通过排序和添加去重逻辑,使用回溯法避免生成重复的排列组合。
|
5月前
|
Python
【Leetcode刷题Python】46. 全排列
本文介绍了LeetCode题目46的Python编程解决方案,题目要求给定一个不含重复数字的数组,返回该数组所有可能的全排列。
29 0
|
7月前
|
机器学习/深度学习 存储 算法
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
Python5种算法回溯+剪枝、字典序、递归交换、计数回溯、迭代法 实现全排列ll【力扣题47】
|
8月前
|
算法 C语言 容器
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(下)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
70 7
|
8月前
|
C语言
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145(中)
从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145
66 1