题目描述
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
方法一:二进制位表示
解题思路
- 利用二进制来表示,长度为n的数组全组合的子集数量是
2^n-1
个元素 - 从0到
2^n-1
每个数的二进制位表示一个子集,该为为1,就说明数组中对应下标的元素在此次子集中,为0则不在 - 通过右移和1相与来获取子集
- 时间复杂度O(n * 2^n)
代码实现
func subsets(nums []int) [][]int {
res := make([][]int, 0)
for i := 0; i < (1 << len(nums)); i++ {
sub := make([]int, 0)
for j := 0; j < len(nums); j++ {
if (i >> j) & 1 == 1 {
sub = append(sub, nums[j])
}
}
res = append(res, sub)
}
return res
}
方法二:枚举
解题思路
- 遍历结果集,每次新加一个元素,给结果集中所有子集都copy出来加上新元素
代码实现
// 迭代实现
func subsets(nums []int) [][]int {
res := make([][]int, 0)
res = append(res, []int{})
for _, num := range nums {
for _, arr := range res {
sub := make([]int, len(arr))
copy(sub, arr)
res = append(res, append(sub, num))
}
}
return res
}