子集
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 22 ms, 内存: 16.2 MB
/*
* 给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
* 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
*
* 示例 1:
* 输入:nums = [1,2,3]
* 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
*
* 示例 2:
* 输入:nums = [0]
* 输出:[[],[0]]
*
* 提示:
* 1 <= nums.length <= 10
* -10 <= nums[i] <= 10
* nums 中的所有元素 互不相同
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
for (int num : nums) {
List<List<Integer>> newSubsets = result.stream()
.map(subset -> {
List<Integer> newSubset = new ArrayList<>(subset);
newSubset.add(num);
return newSubset;
})
.collect(Collectors.toList());
result.addAll(newSubsets);
}
return result;
}
}
解释
方法:
此题解采用深度优先搜索(DFS)的方式来生成所有可能的子集。递归函数`dfs`接受两个参数,`i`表示当前考虑到的数组元素索引,`path`表示当前构建的子集。每次递归调用有两个选择:不包含当前元素,或包含当前元素。当索引`i`超过数组长度时,将当前路径`path`添加到结果列表`res`中,这表示一个完整的子集已形成。递归过程中,先进行一次递归以跳过当前元素(即不将其加入到当前子集中),然后将元素加入`path`进行另一次递归调用,之后再将其移除以恢复状态,以便回溯。
时间复杂度:
O(n * 2^n)
空间复杂度:
O(n * 2^n)
代码细节讲解
🦆
请问为什么在递归函数中先进行'不包含当前元素'的递归调用,而不是先进行'包含当前元素'的调用?是否会影响最终子集的顺序?
▷🦆
在递归函数中,当'path'列表加入新元素时,为什么需要在之后执行一次'回溯'操作,即移除最近添加的元素?
▷🦆
递归终止条件为'if i >= len(nums)',能否详细解释为什么选择这个条件作为终止条件?
▷