【Day51】78.子集

文章目录

78.子集

题目:

给你一个整数数组 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 <= numsi <= 10

nums 中的所有元素 互不相同


思路:

数组里每个元素只有两种选择

  1. 这个元素
  2. 不选这个元素

递归就是逐个处理数组元素,对每个元素都做这两种选择,直到处理完所有元素,把当前的子集存起来。


代码实现(Go):

go 复制代码
package main

import "fmt"

// subsets 求数组所有子集
func subsets(nums []int) [][]int {
	// 保存最终答案
	var ans [][]int
	// 保存当前正在拼接的子集
	var path []int

	// 定义递归函数:cur 表示现在处理第几个数字
	var dfs func(cur int)
	dfs = func(cur int) {
		// 递归终止:所有数字都处理完了
		if cur == len(nums) {
			// 把当前子集复制一份,加入答案
			ans = append(ans, append([]int{}, path...))
			return
		}

		// ==================== 两个选择 ====================
		// 选择1:选当前数字 → 加入path → 继续下一个
		path = append(path, nums[cur])
		dfs(cur + 1)

		// 选择2:不选当前数字 → 回退(删掉最后一个)→ 继续下一个
		path = path[:len(path)-1]
		dfs(cur + 1)
	}

	// 从第0个数字开始递归
	dfs(0)

	return ans
}

func main() {
	fmt.Println(subsets([]int{1, 2, 3})) // [[] [3] [2] [2 3] [1] [1 3] [1 2] [1 2 3]]
	fmt.Println()
	fmt.Println(subsets([]int{0})) // [[] [0]]
}

时间复杂度:O(n × 2ⁿ)

  • 数组长度 n,总共有 2ⁿ 个子集(每个元素选/不选)
  • 每个子集需要复制一次,复制耗时 O(n)
  • 总时间:n × 2ⁿ

空间复杂度:O(n)

  • 递归调用栈深度 = 数组长度 n
  • 临时子集 current 最大长度 = n
  • 结果存储空间不算额外空间(题目要求必须输出)

相关推荐
JavaPub-rodert2 小时前
Go 后台如何同时兼容 MySQL、PostgreSQL、SQLite 和 SQL Server?从 ShiyuAdmin 看 GORM 多数据库适配
数据库·mysql·postgresql·golang·javapub·王仕宇
剩下了什么16 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
ttwuai1 天前
Go 后台接入 SSO 后菜单正常但接口 403,怎么排查权限链路?
开发语言·后端·golang
PC2005-cloud1 天前
Go学习笔记:基本概念与项目结构——GOPATH、Go Modules 与常用命令
笔记·学习·golang
ttwuai1 天前
Go 后台图片上传到对象存储后,预览 403/404 怎么排查?
开发语言·golang
我变成萤火虫1 天前
反悔贪心(经典题目讲解)
c++·算法·贪心算法·stl·排序算法·反悔贪心
_Narcissus_1 天前
排序算法总结表格
c语言·数据结构·c++·笔记·算法·排序算法·总结
名字还没想好☜1 天前
Go 1.23 range-over-func 迭代器实战:自定义可迭代类型、提前退出与惰性求值
开发语言·后端·golang·go·迭代器
灯澜忆梦1 天前
【基于GO的Web开发4】html/template 模板语法
后端·golang·html
thefool1122661 天前
快速排序(递归和非递归)
排序算法