Leetcode---Subsets

【LeetCode】求数组元素的所有子集:Subsets 1. 递归解法 1.1 递归解法1 思路比较清晰,每个元素都有两种可能性:选或者不选,直接上代码 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int> > result; vector<int> subset; sort 阅读详情

Given a set of distinct integers,  S , return all possible subsets.

Note: 

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example, 
If  S  =  [1,2,3] , a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

思路一:输出解空间树的叶子节点,需要记录哪些是叶子节点,这就需要知道现在到底遍历到哪一层了。方法有很多,可以用全局变量记录,也可以用递归函数的参数记录。

A)这里是用全局变量记录,在进入函数的时候level++,退出函数的时候level--。

int level=0;
vector<vector<int> > result;
vector<int> temp;
void dfs(vector<int>& S){
    level++;
    if(level>S.size()){
        result.push_back(temp);
        level--;
        return;
    }
    temp.push_back(S[level-1]);
    dfs(S);
    temp.pop_back();
    dfs(S);
    level--;
    return;
}
vector<vector<int> > subsets(vector<int>& S){
    sort(S.begin(),S.end());
    dfs(S);
    reverse(result.begin(),result.end());
    return result;
}

B)这里记录层数用的是函数参数

vector<vector<int> > result;
vector<int> temp;
void dfs(vector<int>& S, int i){
    if(i==S.size()){
        result.push_back(temp);
        return;
    }
    temp.push_back(S[i]);
    dfs(S,i+1);
    temp.pop_back();
    dfs(S,i+1);
    return;
}
vector<vector<int> > subsets(vector<int>& S){
    dfs(S,0);
    reverse(result.begin(),result.end());
    return result;
}

C)上面都是用全局变量记录中间结果,其实也可以采用参数形式记录,而参数形式可以是引用传递,也可以是值传递。

这里是引用传递,类似于全局变量。

vector<vector<int> > result;
void dfs(vector<int>& S, int i, vector<int>& temp){
    if(i==S.size()){
        result.push_back(temp);
        return;
    }
    temp.push_back(S[i]);
    dfs(S,i+1,temp);
    temp.pop_back();
    dfs(S,i+1,temp);
    return;
}
vector<vector<int> > subsets(vector<int>& S){
    vector<int> temp;
    dfs(S,0,temp);
    reverse(result.begin(),result.end());
    return result;
}

D) 再写一个值传递。值传递需要考虑每个参数都在栈中有一份拷贝,所以有时候不用再做运算了。

vector<vector<int> > result;
void dfs(vector<int>& S, int i, vector<int> temp){
    if(i==S.size()){
        result.push_back(temp);
        return;
    }
    vector<int> v(temp);
    v.push_back(S[i]);
    dfs(S,i+1,v);
    dfs(S,i+1,temp);
    return;
}
vector<vector<int> > subsets(vector<int>& S){
    vector<int> temp;
    dfs(S,0,temp);
    reverse(result.begin(),result.end());
    return result;
}


思路二:DFS,其中关键在于空集合的处理,空集合什么时候产生??


vector<vector<int> > f(vector<int> &S, int index){
    vector<vector<int> > result;
    vector<int> tmp;
    int n=S.size()-index;
    if(n==0)
        return result;
    if(n==1){
        result.push_back(tmp);
        tmp.push_back(S[index]);
        result.push_back(tmp);
        return result;
    }
    vector<vector<int> > _result=f(S,index+1);
    for(int i=0;i<_result.size();i++){
        tmp.clear();
        result.push_back(_result[i]);
        tmp.push_back(S[index]);
        tmp.insert(tmp.begin()+1,_result[i].begin(),_result[i].end());
        result.push_back(tmp);
    }
    return result;
}
vector<vector<int> > subsets(vector<int> &S) {
    sort(S.begin(),S.end());
    return f(S,0);
}

这里还有个判定为错误的答案,但其实只是集合的顺序和答案不同,从数学上讲也应该是正确的答案。其中空集合产生于temp的size为1时,也就是当输入为{1}时,输出是{[],1}

vector<vector<int> > subsets(vector<int>& S) {
    vector<vector<int> > result;
    if(S.size()==0){
        result.push_back(S);
    }
    while(S.size()>0){
        int last=S.back();
        S.pop_back();
        vector<int> s(S);
        vector<vector<int> > temp=subsets(s);
        for(int i=0;i<temp.size();i++){
            temp[i].push_back(last);
            result.push_back(temp[i]);
        }
        if(temp.size()==1){
            vector<int> a;
            result.push_back(a);
        }
    }
    return result;
}




开源DIY龙门架:从零构建可编程运动控制平台 运动控制是自动化与机器人技术的核心基础,它通过精确指令驱动执行机构,实现物体的定位与轨迹规划。其原理通常涉及控制器、驱动器、电机与传动机构的协同工作,核心价值在于将数字指令转化为精准的物理运动,从而解放人力并提升作业一致性。在工业自动化、桌面制造(如3D打印、激光雕刻)及教育机器人等领域应用广泛。本文聚焦于一个具体的工程实践案例:使用**铝型材**、**3D打印**零件、Arduino控制器及步进电机,从机械结构设计、电路连接到代码编写,手把手教你打造一个模块化、可扩展的开源龙门架系统。该系统不仅成本可控, 阅读详情

相关推荐

RRAM/ Near Memory Computing (NMC) Survey - Reading Notes 0707

Reading Notes of Resistive Random Access Memory – Day 2 Chapter 3 RRAM Characterization and Modeling Overview of RRAM Physical Mechanism A general picture for the filamentary switching mechanism. Forming: 对本征RRAM样本,加电压VformingV_{forming}Vforming​,中间氧化层的O

Blog of Lucky H6 991

LeetCode题解:Subsets

Given a set of distinct integers, nums, return all possible subsets.Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example, If

追风筝的吃货,汪~ 567

手把手搭建摄像头驱动(一):I2C设备树插件与OV5640实战

本文手把手指导如何搭建OV5640摄像头驱动,重点讲解I2C设备树插件的编写与实战应用。通过硬件连接验证、I2C驱动框架搭建、设备树插件编译及动态加载调试,系统介绍Linux驱动开发全流程,并提供常见问题解决方案,帮助开发者快速掌握摄像头驱动开发技术。

git9versioner的博客 754

leetcode-- Subsets

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 比比两句,好久没刷题,看到这道题,脑海里愣是没想到DFS,哎,心里默念一句草泥马呀 第一种...

Windsearcher的博客 243

基于java实现的弹幕视频网站

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9系统展示弹幕视频网站,在弹幕视频网站可以查看首页、视频信息、商品信息、论坛信息、我的、跳转到后台、购物车、客服等内容前台首页界面图登录,通过登录填写账号、密码等信息进行登录操作登录界面图视频信息界面图。

DC5621的博客 1333

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2203

LeetCode - 解题笔记 - 78 - Subsets

Solution 1 使用DFS回溯,比较传统的做法。 时间复杂度:O(N×2N)O( N \times 2^N )O(N×2N),其中NNN即为输入数字列表的长度,决策树的分枝有2N2^N2N个,每一个分支遍历完成需要到达深度NNN 空间复杂度:O(N)O(N)O(N),一次只需要保存最多全部数组,回溯的资源消耗与树最大深度一致 class Solution { public: vector<vector<int>> subsets(vector<int>&

支锦铭的博客 262

45、数据挖掘学术文献推荐

本文是一篇关于数据挖掘领域的重要学术文献推荐,涵盖了经典理论与最新研究成果。内容包括关键研究论文、综述文章、教科书和专著的介绍,以及来自顶级会议和期刊的出版物推荐。此外,还探讨了数据挖掘与其他领域的交叉研究,如机器学习、统计学和数据库系统,并列举了多个实际应用案例。最后,分析了数据挖掘的未来发展趋势,如更加智能化的算法、高效的计算平台及隐私保护技术。无论是初学者还是专业人士,这些文献都将提供宝贵的学习资源和前沿动态。

qsc90123456的博客 229

LeetCode - Subsets

基本: 每一个元素要还是不要,所以总共2^n个subsets 解法一:BFS non-recursion use an extra vector class Solution { public: vector&lt;vector&lt;int&gt;&gt; subsets(vector&lt;int&gt;&amp; nums) { vector&lt;vect...

real_lisa的博客 262

17、激光切割焦点位置和入射角对切割质量的影响研究

本研究通过响应面方法(RSM)结合Box-Behnken设计,系统分析了激光功率、切割速度和气体压力对SS 304不锈钢激光切割质量的影响,重点探讨了三种不同喷嘴在不同聚焦条件下的切缝比和条纹深度变化规律。实验结果表明,激光功率、切割速度和气体压力对切割质量具有显著影响,且不同喷嘴因焦点位置差异表现出不同的响应趋势。通过回归建模与优化,确定了最小激光功率、适中切割速度和最大气体压力为最优参数组合,可实现最小切缝比和较优条纹深度。研究为实际激光切割工艺提供了科学的参数选择依据和操作流程建议,有效提升了切割精度

mm9012的博客 126

基于STM32L4XX、HAL库的 TMC2660C-PA 驱动程序设计

/ 默认灵敏度和电流。// 20/31最大电流。

zhusl6688的博客 384

力扣Leetcode 78 | 子集(Subsets)

参考: https://leetcode-cn.com/problems/subsets/solution/yong-shi-ji-bai-9351de-yong-hu-by-lei-hou-ya/ 1 迭代法 从条件上入手,先只考虑给定数组的 1 个元素的所有子数组,然后再考虑数组的 2 个元素的所有子数组 … 最后再考虑数组的 n 个元素的所有子数组。求 k 个元素的所有子数组,只需要在 k - 1 个元素的所有子数组里边加上 nums [ k ] 即可。 例如 nums [1 , 2, 3] 的遍历过

maoersong的专栏 291

AUTOSAE软件配置-达芬奇( DaVinci Configurator)从新建工程开始

方法1,直接使用案例工程,一般SIP包会有一个创建好的案例工程,在这样的路径YOUR_SIP_DIR/Applications/SipAddon/StartApplication下面直接打开这个*.dpa文件即可看到已经预先做好的工程:但是,这个也不是全的,也不一定完全正确,至少MCAL是没有配置好的(MCAL是IC厂商提供的,并不归属SIP包的一部分)。这样就需要你自己去配置你想要的模块,修改里面的错误。

m0_49148264的博客 2944

LeetCode力扣之Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).Note: The solution set must not contain duplicate subsets.For example,If nums = [1,2,2],...

LeeWei 189

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode 78. Subsets

Subsets - LeetCode Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: nums = [1,2,3] Output...

zhaohaibo的博客 907

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode Subsets

给定一个由不同数字组成的集合,罗列出该集合的所有子集。

DRFish 1650

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Subsets - LeetCode

目录 题目链接 注意点 解法 小结 题目链接 Subsets - LeetCode 注意点 解法 解法一:递归,每次就将tmp加入ret中,然后往tmp中加一个数字,继续递归。原理如下,第i(i > 0)层表示nums[i-1]的状态(选择或者不选择),最...

weixin_30339969的博客 563

Leetcode78. Subsets

Leetcode78. Subsets Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: nums = [1,2,3] Out...

magic_jiayu的博客 705

LeetCode 78: Subsets && LeetCode 90: Subsets II

问题描述 Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: nums = [1,2,3] Output: [ [3], [1], ...

zero 619

LeetCode 90. Subsets II

LeetCode 90. Subsets II (Medium) 主要知识点:回溯、迭代;优先级:5

温迪今天刷题了吗 368

LeetCode --- 78. Subsets

题目链接:Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be in non-descending order.The solution set must not contain duplicate subsets. For

makuiyu的专栏 1166

leetcode专题训练 90. Subsets II

这道题是第78题的升级版,78题中所给数组的元素都是不相同的,所以直接回溯搞一发,每个元素都加或不加搞一发即可。然而这道题中元素可能是相同的,所以不能直接每个元素加或不加来搞。比如样例中的[1, 2, 2],只加前面的那个2和只加后面那个2的结果是重复的,所以需要对相同的数进行判断。 在78题中,一个长为l的数组,子集list的第一个元素可以是数组中的每一个元素,第二个元素就是第一个元素的索引之后的数组中的每一个元素,以此类推。解法如下: class Solution: def subsets(se

Ema1997的博客 300

【LeetCode】解题90:Subsets II

LeetCode解题 90:Subsets II Problem 90: Subsets II [Medium]解题思路Solution (Java)修改过程 Problem 90: Subsets II [Medium] Given a collection of integers that might contain duplicates, nums, return all possible ...

Fayedily的博客 258

[leetcode] Subsets Subsets II

Subsets, Subsets II Subsets 问题描述:给定一个不重复的数组A,让计算A中所有数字的排列组合 解决思路:利用DFS来计算所有的组合。 例如A中的数字是1~3 首先我们可以选择{}->{1} -> {1, 2} - >{1, 2, 3} - >{1, 3} - >{2} - > {2, 3} -> {3} 对于第i个数字,我们...

nwpuxhld 595

LeetCode 90. Subsets II

题目来源:https://leetcode.com/problems/subsets-ii/ 问题描述 90.Subsets II Medium Given a collection of integers that might contain duplicates,nums, return all possible subsets (the power set). Note:Th...

da_kao_la的博客 576

LeetCode78——Subsets

LeetCode78——Subsets 跟LeetCode77——Combination几乎一模一样,做题的时候也是套用了上一题的代码。 还是简单说一下题意: 1.给出一个集合A(A中的元素不一定是非递减,所以之前进行一次排序) 2.找出A的所有这种性质的子集: a)空集 b)长度分别是1~A.size() 集合 c)这些集合是K阶全排列非递减 好了,借用上一题的help函

上善若水 1370
上一篇: Leetcode---Clone Graph
下一篇: Leetcode---Permutations
我把葡萄酿成酒
博客等级 码龄12年 275粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值