题目来源力扣
示例
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
输入:nums = [0]
输出:[[],[0]]
思路:回溯函数传入字符开始的位置startIndex,不断递归,每一层startIndex加1,当一个分支结束之后在,开始回溯,进入另一个分支。
复杂度:时间复杂度O(n*2n),如图递归出来的状态是2n个状态,每个状态构建path数组复杂度是O(n)。空间复杂度O(n),也就是递归栈的空间
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
let res = []//存放结果
let path = []//存放每次进入的分支的结果
function backtracking(startIndex) {//startIndex为每次递归开始的位置
res.push(path.slice())//将每次递归结果推入res数组,path.slice()是为了断开和path的引用关系
for(let i = startIndex; i < nums.length; i++) {//从startIndex开始递归
path.push(nums[i])//当前字符推入path
backtracking(i + 1)//startIndex向后移动一个位置 继续递归,继续往该分支下走
path.pop()//回溯状态,以便递归其他分支
}
}
backtracking(0)
return res
};