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;
    }
};
相关推荐
Matlab仿真实验室2 小时前
基于Matlab实现LDA算法
开发语言·算法·matlab
@蓝莓果粒茶2 小时前
LeetCode第244题_最短单词距离II
c++·笔记·学习·算法·leetcode·职场和发展·c#
多多*2 小时前
蓝桥杯国赛训练 day1
java·开发语言·数据库·redis·缓存·职场和发展·蓝桥杯
宋一诺333 小时前
机器学习——随机森林算法
算法·随机森林·机器学习
无聊的小坏坏3 小时前
二分查找的边界艺术:LeetCode 34 题深度解析
算法·leetcode
CHNLee玉米3 小时前
题目解析 1.找单独的数 | 豆包MarsCode AI刷题
算法
緈福的街口3 小时前
【leetcode】20. 有效的括号
linux·算法·leetcode
小程序华东同舟求职3 小时前
25年宁德时代新能源科技SHL 测评语言理解数字推理Verify题库
经验分享·面试·职场和发展·求职招聘
PixelMind4 小时前
【LUT技术专题】图像自适应3DLUT代码讲解
人工智能·python·算法·lut
czxyvX4 小时前
06-排序
c语言·数据结构·算法·排序算法