Subsets
题目描述
子集:
给定一组不含重复元素的整数数组nums
,返回该数组所有可能的子集(幂集)
示例:
输入:nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解法
解法一:递归
时间复杂度:
O(N*2^N)
空间复杂度:
O(N)
func subsets(nums []int) [][]int {
result := [][]int{}
sub := []int{}
result = append(result, sub)
return recursion(nums, 0, result)
}
func recursion(nums []int, i int, result [][]int) [][]int {
if i >= len(nums) {
return result
}
size := len(result)
for j := 0; j < size; j++ {
sub := []int{}
sub = append(sub, result[j]...)
sub = append(sub, nums[i])
result = append(result, sub)
}
return recursion(nums, i+1, result)
}
解法二:迭代
时间复杂度:
O(N*2^N)
空间复杂度:
O(1)
func subsets(nums []int) [][]int {
result := [][]int{}
sub := []int{}
result = append(result, sub)
for i := 0; i < len(nums); i++ {
size := len(result)
for j := 0; j < size; j++ {
sub = []int{}
sub = append(sub, result[j]...)
sub = append(sub, nums[i])
result = append(result, sub)
}
}
return result
}
解法三:回溯法
时间复杂度:
O(2^N)
空间复杂度:
O(N)(此处是通常的空间复杂度,还得依赖具体语言的实现)
func subsets(nums []int) [][]int {
result := [][]int{}
sub := []int{}
return backtrack(nums, 0, result, sub)
}
func backtrack(nums []int, j int, result [][]int, sub []int) [][]int {
sub = append([]int{}, sub...)
if j == len(nums) {
result = append(result, sub)
return result
}
sub = append(sub, nums[j])
result = backtrack(nums, j+1, result, sub)
sub = sub[:len(sub)-1]
result = backtrack(nums, j+1, result, sub)
return result
}
解法四:二进制位法
时间复杂度:
O(N*2^N)
空间复杂度:
O(1)
func subsets(nums []int) [][]int {
result := [][]int{}
for i := 0; i < (1 << len(nums)); i++ {
layer := []int{}
for j := 0; j < len(nums); j++ {
if (1 << j) > i {
break
}
if (i>>j)&1 == 1 {
layer = append(layer, nums[j])
}
}
result = append(result, layer)
}
return result
}
Last updated
Was this helpful?