leetcode 90子集2 回溯算法

12 篇文章 0 订阅
11 篇文章 0 订阅
这篇博客探讨了如何使用递归和回溯法解决包含重复元素的子集问题。作者通过一个C++代码示例展示了如何利用辅助数组isVisited避免重复,并在回溯过程中确保正确结果的生成。文章强调了在处理同一层和同一树枝上的重复元素时的策略差异。
摘要由CSDN通过智能技术生成

问题描述

在这里插入图片描述

思路

首先明确这是一个组合问题,组合问题的start会随着递归的推进而改变,根据树状图和容易就明白。这里主要考虑重复的问题,就拿[122]这个例子来说,第2个2,与第一个2在同一层树时需要跳过,因为第一个2已经拿过了,所以不需要在考虑2,但是在同一个树枝上时,就要考虑2,来得到[122]这个结果,所以遇到解决重复的问题,那就需要一个辅助数组isVisited,来判断是否被访问。如果当前元素等于它前面的一个元素,那么如果考虑在同一层,由于回溯,之前那个元素的isVisted=false,这时候我们就不能再取当前元素。在考虑在同一个树枝的情况是,他前面的那一个元素的isVisited=true,于是就可以得到理想的结果。

在这里插入图片描述

代码

class Solution {
public:
    vector <vector <int>>  res;
    vector <bool> isVisited;
    void getSub(vector <int>&nums,int start,vector <int> &p)
    {
        if(start==nums.size()) {
            res.push_back(p);
            return;
        }
        if(start>0&&nums[start]==nums[start-1]&&isVisited[start-1]==false) {
            getSub(nums,start+1,p);
        }
        else {
            p.push_back(nums[start]);
            isVisited[start]=true;
            getSub(nums,start+1,p);
            p.pop_back();
            isVisited[start]=false;//回溯
            getSub(nums,start+1,p);
        }
    }
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        if(nums.size()==0) return res;
        isVisited=vector <bool> (nums.size(),false);
        vector <int> p;
        sort(nums.begin(),nums.end());
        getSub(nums,0,p);
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值