Here is the implementation:
function subsets(nums):
result = []
backtrack(0, [])
return result
function backtrack(index, current):
if index == nums.length:
result.append(copy of current)
return
// Include nums[index]
current.append(nums[index])
backtrack(index + 1, current)
current.pop()
// Exclude nums[index]
backtrack(index + 1, current)
time to generate all subsets and copy them. space for recursion stack.