时间复杂度:
解题思路
回溯法解决。
对每一个元素都有放入子集和不放入子集两种选择,所以先尝试放入,然后再用回溯消除对结果的影响,再去尝试不放入的情况。
边界情况就是遍历完所有元素的时候,此时可以将子集追加到结果集中。
此外也可以尝试用0和1代表数组中某个元素是否加到子集中,这样遍历完二进制数字后就可以得到结果了。
AC代码
基本照抄官方题解的代码,自己加了注释。
func subsets(nums []int) [][]int {
res:=[][]int{}
temp:=[]int{}
var dfs func(int)
dfs=func(minIdx int){
res=append(res,append([]int(nil),temp...)) //不能直接追加temp,必须先copy
for i:=minIdx;i<len(nums);i++{
temp=append(temp,nums[i])
dfs(i+1)
temp=temp[:len(temp)-1] //回溯
}
}
dfs(0)
return res
}
感悟
其实就是很简单的回溯,但是写完后看了官方题解发现自己写的go代码味不够浓,还是官方的代码更贴近Go语言风格,得注意函数值、复制数组、删除最后一个元素这些细节。