题目: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:子集(简单易懂的回溯)的更多相关文章

  1. Leetcode题目78.子集(回溯-中等)

    题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1] ...

  2. LeetCode Top 100 Liked 点赞最高的 100 道算法题

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:刷题顺序,刷题路径,好题,top100,怎么刷题,Leet ...

  3. [Leetcode 78]求子集 Subset

    [题目] Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The ...

  4. [LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###

    描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[&q ...

  5. [LeetCode] Top 100 Liked Questions

    [LeetCode] Top 100 Liked Questions # Title Acceptance Difficulty 1 Two Sum 38.80% Easy 2 Add Two Num ...

  6. [LeetCode] Subsets II 子集合之二

    Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...

  7. leetcode top 100 题目汇总

    首先表达我对leetcode网站的感谢,与高校的OJ系统相比,leetcode上面的题目更贴近工作的需要,而且支持的语言广泛.对于一些比较困难的题目,可以从讨论区中学习别人的思路,这一点很方便. 经过 ...

  8. Leetcode题目46.全排列(回溯+深度优先遍历+状态重置-中等)

    题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...

  9. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...

  10. [LeetCode] 17. 电话号码的字母组合(回溯)

    题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[& ...

随机推荐

  1. Linux+Wine玩火影忍者究极风暴3指南

    如果你的系统没有Wine先装Wine,Wine在各大发行版的源都能找到.记住32位和64位的Wine都要装 去https://www.playonlinux.com/wine/binaries/pho ...

  2. Java并发编程 | 从进程、线程到并发问题实例解决

    计划写几篇文章讲述下Java并发编程,帮助一些初学者成体系的理解并发编程并实际使用,而不只是碎片化的了解一些Synchronized.ReentrantLock等技术点.在讲述的过程中,也想融入一些相 ...

  3. 适用于移动端、PC 端 Vue.js 图片预览插件

    1.安装:npm install --save vue-picture-preview 2.使用: (1)入口文件中main.js中全局引入: import Vue from 'vue' import ...

  4. Java学习之路:Dos命令

    2022-10-08  10:25:42 (一)打开CMD的方式 开始+系统+命令提示符 Win+R  输入cmd打开控制台 在任意的文件夹下面,按住Shift+鼠标右键,点击在此打开命令行窗口 资源 ...

  5. Flink WordCount入门

    下面通过一个单词统计的案例,快速上手应用 Flink,进行流处理(Streaming)和批处理(Batch) 单词统计(批处理) 引入依赖 <!--flink核心包--> <depe ...

  6. Hudi 数据湖的插入,更新,查询,分析操作示例

    Hudi 数据湖的插入,更新,查询,分析操作示例 作者:Grey 原文地址: 博客园:Hudi 数据湖的插入,更新,查询,分析操作示例 CSDN:Hudi 数据湖的插入,更新,查询,分析操作示例 前置 ...

  7. pip cmd下载速度慢解决方案

    cmd下载速度慢不是电脑问题,而是下载的网站有网速限制,如pip,虽然没被墙,但由于是外网,网速极差,经常是几KB一秒,所以我们可以采用镜像服务器,即在命令后加上 -i https://pypi.tu ...

  8. day53-马踏棋盘

    马踏棋盘 1.算法优化的意义 算法是程序的灵魂,为什么有些程序可以在海量数据计算时,依旧保持高速计算? 编程中算法很多,比如八大排序算法(冒泡.选择.插入.快排.归并.希尔.基数.堆排序).查找算法. ...

  9. Landau-Vishkin

    基础算法 假设我们有两个字符串:,每个字符串由A C G T四个字母组成. 在两个字符串上,都有三种可能的编辑操作(突变): 删除某个字符 在某个位置插入字符 改变某个字符 每一个编辑操作都有惩罚值. ...

  10. Debian玩红警2

    Debian玩红警2 1. 安装wine sudo apt update sudo apt install wine wine --version wine-5.0.3 (Debian 5.0.3-3 ...