leetcode日记(77)子集Ⅱ

不知道为什么看到这道题就很头痛......

其实只要掌握nums不包含重复元素的情况下的代码就行了。

若nums不能包含重复元素,那么使用回溯很容易就能写出来:

cpp 复制代码
class Solution {
    void hs(vector<int> v,int x,vector<int> r,vector<vector<int>>& result){
        if(x==v.size()){
            result.push_back(r);
            r.clear();
            return ;
        }
        r.push_back(v[x]);
        hs(v,x+1,r,result);
        r.pop_back();
        hs(v,x+1,r,result);
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<int> r;
        vector<vector<int>> result;
        hs(nums,0,r,result);
        return result;
    }
};

一开始我在回溯的函数里鬼使神差写了一个循环导致结果多出一大堆......以后可千万不能犯这样的低级错误了............

接着就是考虑nums中能有重复元素的情况,这种情况下若重复元素上一个相同元素没有选上,那么以后的这个元素也不能选,知道这个原理就可以将nums排序,让重复元素互相挨着,每次不选上一个元素,若下一个元素还是这个元素就跳过不取。

cpp 复制代码
class Solution {
    void hs(vector<int> v,int x,vector<int> r,vector<vector<int>>& result){
        if(x==v.size()){
            result.push_back(r);
            r.clear();
            return ;
        }
        r.push_back(v[x]);
        hs(v,x+1,r,result);
        r.pop_back();
        for(int i=x;i<v.size()-1;i++){
            if(v[x]==v[x+1]) x++;
        }
        hs(v,x+1,r,result);
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<int> r;
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());
        hs(nums,0,r,result);
        return result;
    }
};
相关推荐
神秘的t33 分钟前
优选算法合集————双指针(专题三)
java·数据结构·算法·二分查找
骑驴看星星a1 小时前
P10904 [蓝桥杯 2024 省 C] 挖矿
c语言·算法·蓝桥杯
代码骑士1 小时前
决策树(Decision Tree)基础知识
算法·决策树·机器学习
杨校1 小时前
杨校老师课堂之备战信息学奥赛算法背包DP练习题汇总
c++·算法·信息学竞赛·dp算法
CodeJourney.1 小时前
DeepSeek赋能Power BI:开启智能化数据分析新时代
数据库·人工智能·算法
没资格抱怨2 小时前
Element Plus中的树组件的具体用法(持续更新!)
前端·javascript·算法
Y1nhl2 小时前
数据挖掘校招面经二
人工智能·python·深度学习·算法·机器学习·数据挖掘
Helene19002 小时前
Leetcode 378-有序矩阵中第 K 小的元素
算法·leetcode·矩阵
_GR2 小时前
2017年蓝桥杯第八届C&C++大学B组真题及代码
c++·职场和发展·蓝桥杯
一只_程序媛2 小时前
【leetcode hot 100 73】矩阵置零
算法·leetcode·矩阵