Leetcode78. 子集
Leetcode78. 子集
题目描述
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
1 | 输入:nums = [1,2,3] |
示例 2:
1 | 输入:nums = [0] |
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
解题思路
这道题只能用暴力枚举的方式求解。使用DFS+回溯实现比较简单。
用index
来代表当前处理元素的下标,对于每一个元素,都有选择和不选择两种状态,对这两种情况分别递归:
如果不选择当前元素,则:
1 | DFS(nums,index+1,temp); |
直接递归下一个元素即可。
如果选择当前元素,则:
1 | temp.push_back(nums[index]); |
将当前元素加入一个可能的答案序列,然后递归处理下一个元素。
最后我们需要一个递归出口:
当数组全部元素都被处理过之后,将一个答案添加到最终的答案数组,如下:
1 | if(index>=nums.size()) |
具体细节如示例代码所示。
示例代码
1 | vector<vector<int>>ans; |
时间复杂度为:$$O(n \times 2 ^ n)$$。一共$ 2^n$个状态,每种状态需要 的时间来构造子集。
空间复杂度:。临时数组temp
的空间代价是 ,递归时栈空间的代价为。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!