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;
    }
};
相关推荐
MM_MS5 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
独自破碎E6 小时前
【二分法】寻找峰值
算法
mit6.8246 小时前
位运算|拆分贪心
算法
ghie90906 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体16 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit
wuk9986 小时前
VSC优化算法MATLAB实现
开发语言·算法·matlab
Z1Jxxx7 小时前
加密算法加密算法
开发语言·c++·算法
乌萨奇也要立志学C++7 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
vyuvyucd8 小时前
C++引用:高效编程的别名利器
算法
鱼跃鹰飞8 小时前
Leetcode1891:割绳子
数据结构·算法