LeetCode-78. 子集【位运算 数组 回溯】

LeetCode-78. 子集【位运算 数组 回溯】

  • 题目描述:
  • 解题思路一:回溯,回溯三部曲
  • 解题思路二:0
  • 解题思路三:0

题目描述:

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集
(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同

解题思路一:回溯,回溯三部曲

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

有同学问了,什么时候for可以从0开始呢?

求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。

以示例中nums = [1,2,3]为例把求子集抽象为树型结构,如下:
在这里插入图片描述

  1. 递归函数参数

全局变量数组path为子集收集元素,二维数组result存放子集组合。(也可以放到递归函数参数里)

递归函数参数在上面讲到了,需要startIndex。

  1. 递归终止条件

从图中可以看出:
在这里插入图片描述
剩余集合为空的时候,就是叶子节点。

那么什么时候剩余集合为空呢?

就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了,其实可以不需要加终止条件,因为startIndex >= nums.size(),本层for循环本来也结束了。

  1. 单层搜索逻辑
    求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树。
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res = []self.backtracking(nums, 0, [], res)return resdef backtracking(self, nums, startIndex, path, res):res.append(path[:])for i in range(startIndex, len(nums)):path.append(nums[i])self.backtracking(nums, i + 1, path, res)path.pop()

时间复杂度:O(n * 2n)
空间复杂度:O(n)

解题思路二:0


时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:0


时间复杂度:O(n)
空间复杂度:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringCloud】Nacos 注册中心

目 录 一.认识和安装 Nacos1.Windows安装1. 下载安装包2. 解压3. 端口配置4. 启动5. 访问 2.Linux安装1. 安装JDK2. 上传安装包3. 解压4. 端口配置5. 启动 二.服务注册到 nacos1. 引入依赖2. 配置 nacos 地址3. 重启 三.服务分级存储模型1. 给 user-service 配置集群2. 同集群优…

JavaWeb前端基础(HTML CSS JavaScript)

本文用于检验学习效果&#xff0c;忘记知识就去文末的链接复习 1. HTML 1.1 HTML基础 结构 头<head>身体<body> 内容 图片<img>段落<p>图标<link> 标签 单标签双标签 常用标签 div&#xff1a;分割块span&#xff1a;只占需要的大小p&…

Jones矩阵符号运算

文章目录 Jones向量Jones矩阵 有关Jones矩阵、Jones向量的基本原理&#xff0c;可参考这个&#xff1a; 通过Python理解Jones矩阵&#xff0c;本文主要介绍sympy中提供的有关偏振光学的符号计算工具 Jones向量 Jones向量是描述光线偏振状态的重要工具&#xff0c;例如一个偏振…

LINUX上,用命令cmake编译CLion项目

原来CLion项目是远程到开发板上进行编译&#xff0c;十分方便。现在想在虚拟机环境中编译&#xff0c;更加方便。于是进行了一番研究&#xff0c;还挺简单。 默认编译选项 搜索到的编译命令如下&#xff0c;不适合我的项目。 cmake -B${CMAKE_DIR} -H. 我的编译命令 开始编…

从三个维度看,你的企业是否需要引入精益管理咨询?

在快速变化的商业环境中&#xff0c;企业不断寻求提升自身运营效率和竞争力的方法。其中&#xff0c;精益管理作为一种追求卓越、消除浪费的管理理念&#xff0c;被越来越多的企业所认可。但是&#xff0c;如何判断自己的组织是否需要进行精益企业管理咨询呢&#xff1f;天行健…

141.环形链表

题目描述 解题思路 ——————遍历链表&#xff0c;哈希表记录节点—————— 时间复杂度O(n)&#xff0c;空间复杂度O(n) 1.cur指针遍历链表&#xff0c;并且创建哈希表&#xff0c;用于记录节点的地址 2.每次遍历先判断地址是否在哈希表中&#xff0c;若在则直接返回…

java 方法参数类型为double 可以传 int类型?

在Java语言中&#xff0c;方法的参数类型定义了调用该方法时应传递的数据类型。当一个方法的参数类型被定义为double时&#xff0c;实际上可以向该方法传递一个int类型的参数。这是因为Java支持基本数据类型之间的自动类型转换&#xff08;也称为隐式类型转换&#xff09;&…

【漏洞复现】通天星CMSV6车载视频监控平台FTP匿名访问

Nx01 产品简介 通天星车载视频监控平台软件拥有多种语言版本&#xff0c;应用于公交车车载视频监控、校车车载视频监控、大巴车车载视频监控、物流车载监控、油品运输车载监控等公共交通上。 Nx02 漏洞描述 通天星车载视频监控平台安装完毕后会默认开放端口2121作为ftp服务使用…

多语言婚恋交友APP开发的关键成功因素

随着移动互联网的快速发展&#xff0c;多语言婚恋交友APP的需求和发展逐渐成为了一个备受关注的话题。在全球范围内&#xff0c;人们希望通过移动应用来寻找爱情、建立关系和拓展社交圈子&#xff0c;因此开发一款具有全球影响力的多语言婚恋交友APP成为了许多开发者的目标。针…

Java实现Excel百万级数据的导入(约30s完成)

前言 在遇到大数据量excel&#xff0c;50MB大小或数百万级别的数据读取时&#xff0c;使用常用的POI容易导致读取时内存溢出或者cpu飙升。 本文讨论的是针对xlsx格式的excel文件上传&#xff0c;采用com.monitorjbl.xlsx.StreamingReader 。 什么是StreamReader? StreamReader…

开源低代码平台概况和说明推荐

开源低代码平台是一类允许开发者通过图形化界面和预构建的代码块&#xff0c;而非传统的手动编程方式&#xff0c;来创建应用程序的工具。这些平台通常提供了丰富的功能和特性&#xff0c;帮助开发者更加高效地进行应用开发。 开源低代码平台的概况可以总结为以下几点&#xf…

蓝牙GAP与GATT

GAP 在BLE(蓝牙低功耗)技术中,GAP(Generic Access Profile)负责定义设备如何互相发现、建立连接以及管理连接的过程。GAP是BLE核心规范的一部分,它定义了设备在广播、扫描、连接和断开连接等基本行为上的通用访问方法。 以下是GAP的主要责任: 广播(Advertising): G…

【C++】背包问题

目录 背包问题01 背包背包不装满问题背包必须满问题 完全背包 背包问题 背包问题属于动态规划的一类题型 01 背包 背包不装满问题 背包必须满问题 #include <iostream> using namespace std; const int N 1010; #include <vector> int main() {int n , V;int v[…

【Ambari】Ansible自动化部署大数据集群

目录 一&#xff0e;版本说明和介绍信息 1.1 大数据组件版本 1.2 Apache Components 1.3 Databases支持版本 二&#xff0e;安装包上传和说明 三&#xff0e;服务器基础环境配置 3.1global配置修改 3.2主机名映射配置 3.3免密用户名密码配置 3.4 ansible安装 四. 安…

2024.4.1-[作业记录]-day06-认识 CSS(三大特性、引入方式)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; day06-认识 CSS(三大特性、引入方式) 文章目录 day06-认识 CSS(三大特性、引入方式)作业…

实践笔记-03 docker buildx 使用

docker buildx 使用 1.启用docker buildx2.启用 binfmt_misc3.从默认的构建器切换到多平台构建器3.1创建buildkitd.toml文件&#xff08;私有仓库是http没有证书的情况下&#xff0c;需要配置&#xff09;3.2创建构建器并使用新创建的构建器 4.构建多架构镜像并推送至harbor仓库…

JVM—对象的创建流程与内存分配

JVM—对象的创建流程与内存分配 创建流程 对象创建的流程图如下&#xff1a; 对象的内存分配方式 内存分配的方式有两种&#xff1a; 指针碰撞&#xff08;Bump the Pointer&#xff09;空闲列表&#xff08;Free List&#xff09; 分配方式说明收集器指针碰撞&#xff08…

RIPv1和RIPv2的区别

RIP&#xff08;Routing Information Protocol&#xff09;是一种内部网关协议&#xff0c;用于在局域网或广域网中进行路由信息的传递。RIP有两个版本&#xff1a;RIPv1和RIPv2。以下是两者之间的主要区别&#xff1a; 子网掩码支持&#xff1a;RIPv2支持子网掩码的传送&…

嵌入式设备低功耗无线通信协议

嵌入式设备低功耗无线通信协议 随着物联网&#xff08;IoT&#xff09;技术的迅速发展&#xff0c;嵌入式设备之间的无线通信变得越来越重要。为了满足长时间运行、减少能源消耗以及实现更广泛的网络覆盖等需求&#xff0c;低功耗无线通信协议在嵌入式系统中扮演着举足轻重的角…

三防笔记本丨加固笔记本丨三防笔记本电脑赋能车辆检修

随着汽车数量的不断增加和交通运输行业的发展&#xff0c;车辆检修行业成为了保障交通安全和延长车辆寿命的重要领域。在车辆检修过程中&#xff0c;需要使用各种工具和设备来进行检测、维修和保养&#xff0c;而信息化技术的应用正逐渐渗透到这一行业中&#xff0c;为检修工作…