90. 子集 II(回溯)

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

思路:

在子集的基础上,加上去重即可

class Solution {
public:
    void get(vector<vector<int>> &res, int k, vector<int> &temp, int n, int loc, vector<int> &nums) {
        res.push_back(temp);
        for (int i = loc; i < n; ++i) {
            if (i > loc && nums[i] == nums[i-1])        //去重
                continue;
            temp.push_back(nums[i]);
            get(res, k, temp, n, i + 1, nums);
            temp.pop_back();
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        vector<int> temp;
        get(res, nums.size(), temp, nums.size(), 0, nums);            
        return res;
    }
};

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回溯法是一种通过枚举所有可能的解来求解问题的算法,其核心思想是“试错”,即在解空间中搜索可能的解,每到一个节点时,先尝试一种可能的选择,如果发现这种选择不能得到正确的解,就回溯到上一个节点,然后再尝试另一种可能的选择,直到找到正确的解或者所有的选择都尝试完毕。 回溯法的求解步骤如下: 1. 定义问题的解空间:确定问题的解空间,即问题的所有可能解的集合。 2. 确定搜索的过程:在解空间中搜索可能的解,搜索的过程通常是一个深度优先搜索过程。 3. 确定解的组成方式:确定问题的解的组成方式,即确定一个解是由哪些部分组成的。 4. 判断是否满足约束条件:在搜索的过程中,需要判断每个解是否满足约束条件,如果不满足约束条件,则回溯到上一个节点。 5. 判断是否是最优解:在搜索的过程中,需要判断每个解是否是最优解,如果不是,则回溯到上一个节点。 6. 输出结果:如果找到一个正确的解,就输出结果。 回溯法的剪枝函数类型通常有以下几种: 1. 可行性剪枝:在搜索的过程中,如果发现当前的解已经不能满足约束条件,就直接回溯到上一个节点。 2. 最优性剪枝:在搜索的过程中,如果发现当前的解已经不能成为最优解,就直接回溯到上一个节点。 3. 约束传播:在搜索的过程中,根据已经确定的变量的取值,推导出其他变量的取值范围,从而缩小搜索的空间。 子集树是回溯法中常用的一种搜索策略,其搜索的过程就是在一个集合中选择一些元素,使得这些元素构成的集合满足某些条件。 回溯法有两种实现方式:递归回溯和迭代回溯。递归回溯是指使用函数的递归调用来实现回溯过程,而迭代回溯是指使用循环来实现回溯过程。这两种实现方式的框架如下: 递归回溯框架: ```python def backtrack(路径, 选择列表): if 满足结束条件: 结果.append(路径) return for 选择 in 选择列表: 做出选择 backtrack(路径, 选择列表) 撤销选择 ``` 迭代回溯框架: ```python def backtrack(选择列表): stack = [(路径, 选择列表)] while stack: 路径, 选择列表 = stack.pop() if 满足结束条件: 结果.append(路径) for 选择 in 选择列表: 做出选择 stack.append((路径, 选择列表)) 撤销选择 ``` 以上就是回溯法求解思路、求解步骤、剪枝函数类型、子集树的类型以及递归回溯和迭代回溯框架的介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值