数据结构与算法之递归: LeetCode 78. 子集 (Ts, Py, Go版)

从“Hello World”到区域赛银牌:我的ACM算法打怪升级全记录(附各阶段工具包) 本文记录了作者从编程新手到ACM区域赛银牌获得者的完整学习历程,详细分享了各阶段的算法学习路线、刷题策略和实战经验。涵盖从基础算法到动态规划的系统训练方法,并附赠经过竞赛检验的工具包和资源清单,为算法竞赛爱好者提供实用参考。 阅读详情

子集

  • https://leetcode.cn/problems/subsets/

描述

  • 给你一个整数数组 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 中的所有元素 互不相同

Typescript 版算法实现


1 )回溯1: 逐步放宽长度

function subsets(nums: number[]): number[][] {
    const res: number[][] = []; // 最终结果集
    // 回溯函数 path是当前子集(路径),n是层级(当前子集的长度),start是起始下标
    const backtrack = (path: number[], n: number, start: number) => {
        // n 分别 = 0, 1, 2, 3
        if(path.length === n) {
            res.push(path); // 本次长度达标后, 结束
            return;
        }
        // 没达到n的时候,基于当前path, 继续从nums中组合元素添加元素进入下一轮验证
        for(let i: number = start; i < nums.length; ++i) {
            backtrack(path.concat(nums[i]), n, i+1);
        }
    }
    // 这里是 0 ~ n 闭区间,从 0的个数 开始找子集
    for(let i: number = 0; i <= nums.length; ++i) {
        backtrack([], i, 0);
    }
    return res;
}
  • 解题思路

    • 要求,1.所有子集,没有重复元素
    • 有出路,有死路
    • 考虑回溯
  • 解题步骤

    • 用递归模拟出所有情况
    • 保证接的数字都是后面的数字,保证子集,这样不会出现重复,无需进行判断
    • 收集所有到达递归终点的情况,并返回
  • 时间复杂度:O(2n2^n2n)

    • 每个元素都有两种可能,存在/不存在
  • 空间复杂度:O(n)

    • 依然看递归的深度
    • 递归堆栈

Python3 版算法实现


1 ) 方案1

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = []  # 最终结果集

        def backtrack(path: list[int], n: int, start: int):
            # n 分别 = 0, 1, 2, 3
            if len(path) == n:
                res.append(path)  # 本次长度达标后, 结束
                return
            # 没达到n的时候,基于当前path, 继续从nums中组合元素添加元素进入下一轮验证
            for i in range(start, len(nums)):
                backtrack(path + [nums[i]], n, i + 1)

        # 这里是 0 ~ n 闭区间,从 0的个数 开始找子集
        for i in range(len(nums) + 1):
            backtrack([], i, 0)

        return res

Golang 版算法实现


1 ) 方案1

func subsets(nums []int) [][]int {
	var res [][]int // 最终结果集

	// 回溯函数
	var backtrack func(path []int, n int, start int)
	backtrack = func(path []int, n int, start int) {
		// n 分别 = 0, 1, 2, 3
		if len(path) == n {
			// 创建一个新的切片,防止后续修改影响结果
			newPath := make([]int, len(path))
			copy(newPath, path)
			res = append(res, newPath) // 本次长度达标后, 结束
			return
		}
		// 没达到n的时候,基于当前path, 继续从nums中组合元素添加元素进入下一轮验证
		for i := start; i < len(nums); i++ {
			backtrack(append(path, nums[i]), n, i+1)
		}
	}

	// 这里是 0 ~ n 闭区间,从 0的个数 开始找子集
	for i := 0; i <= len(nums); i++ {
		backtrack([]int{}, i, 0)
	}

	return res
}
PT32F030与MT6826S SPI通讯实战:从硬件连接到数据交互全流程解析 本文详细解析了PT32F030与MT6826S通过SPI通讯的全流程,包括硬件连接、电路设计、SPI外设初始化配置以及数据交互协议实现。通过实战案例和代码示例,帮助开发者快速掌握PT32F030与MT6826S的SPI通讯技术,实现精准的角度和速度数据采集。 阅读详情

相关推荐

AD9371 官方例程构建及单音信号收发

项目构建基本流程和AD9361差不多,由于官方使用的ZCU102,记录下移植遇到的一些问题最终接收到正确的正弦波Errors: 0Errors: 0Errors: 0Errors: 0AD9361。

weixin_44630490的博客 2973

数据结构与算法之递归: LeetCode 46. 全排列 (Ts, Py, Go版)

1 )回溯1: 基于数组。2 )回溯2: 基于交换。

Wang的专栏 1022

区域法(zonal method)重构波前

目的:实现区域法的Matlab代码 1.理论介绍 区域法波前重构即从波前探测器测得的波前斜率中恢复出波前的相位值,其分为:休晋模型(Hudgin)[90]、绍契威尔模型(Southwell)[40]和弗雷德模型(Fried)[48]。 1.1 Fried模型,对于N×N微透镜阵列构成的网格: 以3*3的子透镜为例,解释上式,对其展开 改写为矩阵形式: 记作:S=AΦ,A根据N而确定。S是波前探测器测得的斜率,Φ是重构矩阵的相位值。 1.2 而Southwel...

EyRe1的博客 8200

数据结构与算法之递归: LeetCode 93. 复原 IP 地址 (Ts, Py, Go版)

数据结构与算法之递归: LeetCode 93. 复原 IP 地址

Wang的专栏 595

PX4实战指南:通过遥控器通道映射实现多舵机PWM精准控制

本文详细介绍了通过PX4飞控的AUX PWM接口实现遥控器通道映射控制多舵机的实战指南。内容包括硬件选型与连接、软件参数配置、通道映射方法以及常见问题排查,帮助开发者精准实现无人机舵机PWM控制,适用于云台、机械臂等扩展功能开发。

ee345的博客 305

东方财富网股票API逆向分析:手把手教你破解动态参数(2024最新版)

本文详细解析了2024年东方财富网股票API的动态参数生成机制,包括回调函数、身份验证和时效控制参数的逆向工程方法。通过实战代码演示,帮助开发者破解动态参数,实现高效稳定的股票数据爬取,适用于金融数据分析和量化交易场景。

weixin_29091105的博客 1030

OpenIntegrations社区与支持:如何提问、如何赞助与如何参与开源贡献

OpenIntegrations 是一个面向 1С:Предприятие、OneScript 和 CLI 的开源集成工具包,覆盖 Telegram、VK、Bitrix24、Google、Яндекс、S3、PostgreSQL、SQLite、MySQL 等 30 多个服务的现成调用方法。本文手把手教你在 OpenIntegrations 社区中提问、支持项目,以及以最低门槛参与开源贡献。 [!

gitblog_00940的博客 871

全志DRM框架下LVDS双屏异显配置实战

本文详细介绍了在全志DRM框架下配置LVDS双屏异显的实战经验。涵盖硬件连接、内核配置、设备树修改、背光控制及U-Boot适配等关键步骤,重点解析屏参转换技巧与双屏route配置,帮助开发者解决工业控制台等多屏应用中的显示适配问题,提升开发效率。

rnn9storyteller的博客 814

数据结构与算法之查找: LeetCode 374. 猜数字大小 (Ts, Py, Go版)

1 )迭代 + 二分实现。2 )递归 + 二分实现。

Wang的专栏 386

【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字

0.完整源码获得方式 订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 ----------------------------------------------------------------- 空间激光通信是指以光波作为载波进行数据传输的一种通信方式。目前,空间激光通信己成为人们关注的焦点。在空间激光通信系统中,光斑定位是是一项关键技术。 本论文首先对国内外空间激光通信系统的研究现状进行了阐述,论述了空间激光通信的理论只是,并对CCD成像原理,...

FPGA/MATLAB学习教程/源码/项目合作开发 1292

飞腾UEFI配置GPIO—飞腾FT2000/4 (D2000/8) GPIO引脚配置及使用

讲解了在飞腾UEFI代码中如何添加GPIO配置相关代码,并以GPIO1_B0—B7为例,将这8个引脚配置为GPIO工作模式并默认输出低电平

qq_30135687的博客 5350

数据结构与算法之动态规划: LeetCode 509. 斐波那契数 (Ts, Py, Go版)

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。给定 n ,请计算 F(n)。

Wang的专栏 827

【DEIM创新改进】全网首发、独家特征融合创新改进篇 | CVPR2025 | 引入RLAB残差线性注意力特征融合块,有效融合并强调多尺度特征,有效减少信息丢失,助力DEIM目标检测有效涨点

本文提出了一种改进DEIM网络模型的新方法RLAB(残差线性注意力特征融合模块),用于医学图像生物标志物分割。RLAB模块通过多尺度残差精炼和注意力机制,有效整合编码器跳跃连接与解码器特征图,提升特征对齐和关键区域关注能力。实验表明,该方法在MoNuSeg、DSB等四个医学图像数据集上显著优于现有方法,最高提升4.03%的绝对性能。文章详细介绍了RLAB的网络结构、核心代码实现方式,并提供了将模块集成到DEIM模型的具体步骤。

Ai缝合怪、助力小伙伴高效发论文 350

数据结构与算法之数组: LeetCode 89. 格雷编码 (Ts, Py, Go版)

n 位格雷码序列 是一个由 2n 个整数组成的序列,其中:每个整数都在范围 [0, 2n - 1] 内(含 0 和 2n - 1),第一个整数是 0,一个整数在序列中出现 不超过一次,每对 相邻 整数的二进制表示 恰好一位不同 ,且第一个 和 最后一个 整数的二进制表示 恰好一位不同,给你一个整数 n ,返回任一有效的 n 位格雷码序列

Wang的专栏 944

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构与算法之堆: LeetCode 313. 超级丑数(Ts, Py, Go版)

1 )将问题分而治之 2 )使用堆结构来提升查找性能,优化版 3 )动态规划

Wang的专栏 504

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构与算法之数组: LeetCode 17. 电话号码的字母组合 (Ts, Py, Go版)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

Wang的专栏 1191

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构与算法之矩阵: LeetCode 54. 螺旋矩阵 (Ts, Py, Go版)

1 )减而治之递归实现。

Wang的专栏 689

数据结构与算法之二叉树: LeetCode 100. 相同的树 (Ts, Py, Go版)

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。1 )深度优先递归版本。2 )广度优先迭代版本。

Wang的专栏 733

数据结构与算法之二叉树: LeetCode 101. 对称二叉树 (Ts, Py, Go版)

1 )深度优先递归版本。2 )广度优先迭代版本。

Wang的专栏 764

数据结构与算法之二叉树: LeetCode 112. 路径总和 (Ts, Py, Go版)

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回 true;否则,返回 false。叶子节点 是指没有子节点的节点。

Wang的专栏 664

数据结构与算法之二叉树: LeetCode 145. 二叉树的后序遍历 (Ts, Py, Go版)

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

Wang的专栏 707

数据结构与算法之查找: LeetCode 704. 二分查找 (Ts, Py, Go版)

时间复杂度 O(logn)每次比较,搜索范围缩半劈成2半的问题都是O(logn)

Wang的专栏 460

数据结构与算法之图: LeetCode 417. 太平洋大西洋水流问题 (Ts, Py, Go版)

给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度。返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋。岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。“太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。

Wang的专栏 305

数据结构与算法之二叉树: LeetCode 144. 二叉树的前序遍历 (Ts, Py, Go版)

二叉树的前序遍历,给你二叉树的根节点 root ,返回它节点值的 前序 遍历

Wang的专栏 312

数据结构与算法之二叉树: Leetcode 94. 二叉树的中序遍历 (Ts, Py, Go版)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历。进阶: 递归算法很简单,你可以通过迭代算法完成吗?

Wang的专栏 572

数据结构与算法之链表: LeetCode 206. 反转链表 (Ts, Py, Go版)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

Wang的专栏 298
上一篇: 数据结构与算法之递归: LeetCode 46. 全排列 (Ts, Py, Go版)
下一篇: AIGC: 关于ChatGPT中API接口调用相关准备工作
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值