LeetCode HOT 100:子集(简单易懂的回溯)
题目:78. 子集
题目描述:
给你一个整数数组,数组中元素互不相同。返回数组中所有可能的子集,且子集不能重复!
什么是子集?举个例子:原数组[1, 2, 3]
,[]、[1]、[1, 2]、[1, 3]、[1, 2, 3]、[2]、[2, 3]、[3]
这些都是原数组的子集。所以说子集就是原数组中零个或几个元素组成的集合。而且,子集是无序的,[1, 2]
和[2, 1]
是同一个子集,所以说虽然[2, 1]
也是原数组的子集,但是题目要求子集不能重复,所以不能在结果中一起出现。
思路:
其实这一题思路和组合总数或全排列很像,也是回溯。只不过每次递归的时候,不能像别的题可以从0
开始穷举,那样会导致子集重复,所以要每次递归的时候,传入一个开始下标startIndex
,这样就能避免子集重复问题。
步骤:
回溯模版可以看前面的全排列或者组合总数题目讲解,这里就不赘述。
本题主要是回溯方法怎么写,所以下面步骤是回溯方法的步骤。
1、先定义好回溯方法的入参,数组,本次递归穷举的开始下标
2、定义好回溯方法后,方法里首先确定回溯结束的条件
这一题可以不需要回溯结束条件。因为这一题本身就是中间状态的子集也需要收集,并没有说子集长度多少或者什么别的条件的时候才收集。而且不加回溯结束条件也不会导致无限递归,因为循环中,开始下标是不断增大的,等到开始下标达到数组长度的时候,自然循环终止!
3、下面就是开始穷举,伪代码如下
for (int i = startIndex; i < nums.length; i++) {
将元素放入数组
迭代回溯方法(传入的开始下标是 i + 1,因为下个迭代从 i + 1 开始遍历)
将元素从数组中删除,回溯
}
代码:
List<List<Integer>> ans;
List<Integer> list;
public List<List<Integer>> subsets(int[] nums) {
ans = new ArrayList<>();
list = new ArrayList<>();
process(nums, 0);
return ans;
}
public void process(int[] nums, int startIndex) {
ans.add(new ArrayList<>(list));
// 子集不讲究顺序,所以[1,2]和[2,1]是同一子集
// 题目要求不能返回重复子集
// 所以 i 不能从 0 开始,要从 startIndex 开始。
// 这样才能保证不断往后找,不能回头找
for (int i = startIndex; i < nums.length; i++) {
list.add(nums[i]);
process(nums, i + 1);
list.remove(list.size() - 1);
}
}
LeetCode HOT 100:子集(简单易懂的回溯)的更多相关文章
- Leetcode题目78.子集(回溯-中等)
题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3], [1] ...
- LeetCode Top 100 Liked 点赞最高的 100 道算法题
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...
- [Leetcode 78]求子集 Subset
[题目] Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The ...
- [LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###
描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[&q ...
- [LeetCode] Top 100 Liked Questions
[LeetCode] Top 100 Liked Questions # Title Acceptance Difficulty 1 Two Sum 38.80% Easy 2 Add Two Num ...
- [LeetCode] Subsets II 子集合之二
Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...
- leetcode top 100 题目汇总
首先表达我对leetcode网站的感谢,与高校的OJ系统相比,leetcode上面的题目更贴近工作的需要,而且支持的语言广泛.对于一些比较困难的题目,可以从讨论区中学习别人的思路,这一点很方便. 经过 ...
- Leetcode题目46.全排列(回溯+深度优先遍历+状态重置-中等)
题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...
- LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...
- [LeetCode] 17. 电话号码的字母组合(回溯)
题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[& ...
随机推荐
- python-数据描述与分析2(利用Pandas处理数据 缺失值的处理 数据库的使用)
2.利用Pandas处理数据2.1 汇总计算当我们知道如何加载数据后,接下来就是如何处理数据,虽然之前的赋值计算也是一种计算,但是如果Pandas的作用就停留在此,那我们也许只是看到了它的冰山一角,它 ...
- 案例分享-https证书链不完整导致请求失败
背景 话不多说,直接上堆栈 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX p ...
- python-D1-typora软件和计算机入门1
一 typora软件 typora是一款目前非常火爆文本编辑器 1.1 安装 尽量安装在非系统盘符及设置为短路径,方便后面查找 1.2 文件路径 在计算机上就是一个资源的定位坐标,表现为具体在哪里,例 ...
- Linux中CentOS 7版本安装JDK、Tomcat、MySQL、lezsz、maven软件详解
软件安装 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式 特点 二进制发布包安装 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 rpm安装 软件已经按照 ...
- 记一次sql文件导入错误
乘着暑假的时候想学习一下SpringCloud的相关技术,但在跟着教程时,导入sql文件的时候出现了问题. 百度搜索发现在运行sql文件前需要提前创建数据库. 但创建数据库之后依然存在问题导致运行sq ...
- 安装与配置FTP服务器
概: 文件传输协议 (File Transfer Protocol,FTP),用于在网络上进行文件传输的协议.如果用户需要将文件从本机发送到另一台计算机,可以使用FTP上传操作:反之,用户可以使用 ...
- 超好用的截图软件Snipaste(包含安装包)、如何设置Snipaste开机自启
文章目录 1.设置开机自动启动 2.基本使用 链接: https://pan.baidu.com/s/1oR2qkOZl5-etPxr7kWip7Q 提取码:8888 1.设置开机自动启动 2.基本使 ...
- Blog1:nchu-software-oop-2022-1~3
(1) 前言 针对在完成三次作业过程中产生的问题进行总结与分析. 三次作业一共十五(9+3+3)道题目,其中前两次难度较为简单,第三次复杂程度飞跃式上涨. 其中,涉及到java语言中基本的输入输出语句 ...
- 纯css爱心代码-最近超级火的打火机与公主裙中的爱心代码(简易版)
theme: cyanosis 最近打火机与公主裙中的爱心代码超级火,看着特别心动,让俺用css来写个简易版!!! 先看效果: 代码拆解: 主要是分为3大部分 分子颗粒 爱心 动画 代码实现: 分子颗 ...
- 1分钟完成在线测试部署便捷收集班级同学文件的web管理系统
最近CSDN推出了一个新功能[云IDE],个人对这个新功能(比赛奖金 )挺感兴趣的,于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统(下面简称该项目为cfile)体验了一下,发现功能还 ...