力扣 90. 子集 II 位运算 回溯

24 篇文章 0 订阅
18 篇文章 0 订阅
该博客讲解了一种解决LeetCode题目(https://leetcode-cn.com/problems/subsets-ii/)的方法,针对含有重复元素的子集问题,通过排序和位运算优化枚举过程,避免重复子集的生成。作者分享了C++代码实现及其核心思路。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/subsets-ii/
在这里插入图片描述
思路:有重复元素,所以枚举的时候要注意了。我们先对nums从小到大排序,假设当前选择了第x个元素,如果我们没有选择第x-1个元素但是这两个元素的值相等,那么一定会有重复的子集,直接跳过这种情况就行了。

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;
        int n=nums.size();
        int times=1<<n;
        ans.push_back(vector<int>());
        for(int i=1;i<times;i++)
        {
            vector<int> tmp;
            bool flag=true;
            for(int j=0;j<n;j++)
            {
                if(i&(1<<j))
                {
                    if(j&&nums[j]==nums[j-1]&&(!(i&(1<<(j-1)))))
                    {
                        flag=false;
                        break;
                    }
                    tmp.push_back(nums[j]);
                }
            }
            if(flag)
                ans.push_back(move(tmp));
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值