78. 子集
题目链接
https://leetcode.cn/problems/subsets/
相关算法
数组、回溯
题目描述
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
数据范围:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
解题思路
本题是很经典的回溯题,回溯算法的核心就是状态的更改和回溯,在这题里,我们创建一个 List<Integer>
对象来保存当前的结果集状态,然后开始进行回溯即可。代码中,还需要注意终止递归的时机和更新结果集的时机,因为这题是所有子集,没有限制情况,所以我们在递归方法一开始就将结果添加到结果集中,而当起始位置无效,即大于等于数组长度时,就终止递归。于是有以下代码实现
完整代码
class Solution {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
backtrace(0, nums);
return ans;
}
private void backtrace(int start, int[] nums) {
ans.add(new ArrayList<>(temp));
if (start >= nums.length) {
return;
}
for (int i = start; i < nums.length; i++) {
temp.add(nums[i]);
backtrace(i + 1, nums);
temp.remove(temp.size() - 1);
}
}
}
- 时间复杂度:
O(n2^n)
- 空间复杂度:
O(n)