外观
子集
⭐ 题目日期:
字节 - 2024/11/3
🌳 题目描述:
给定一个整数数组 nums ,数组中的元素互不相同 。返回该数组所有可能的子集。解集不能包含重复的子集。可以按任意顺序返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [1]
输出:[[],[1]]
🕵🏽 面试评估:
这道题主要考查递归回溯,难度中等,易错点有:递归的使用,回溯后删除添加的元素以还原状态。
🧗 难度系数:
⭐️ ⭐️ ⭐️
📝思路分析:
💻代码:
Java
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums == null || nums.length == 0) {
return result;
}
findSubsets(nums, 0, new ArrayList<>(), result);
return result;
}
private void findSubsets(int[] nums, int index, List<Integer> cur, List<List<Integer>> result) {
if (index == nums.length) {
result.add(new ArrayList<>(cur));
return;
}
// 不选当前元素
findSubsets(nums, index + 1, cur, result);
// 选当前元素
cur.add(nums[index]);
findSubsets(nums, index + 1, cur, result);
// 回溯到当前层,删除已选元素,还原状态
cur.remove(cur.size() - 1);
}
🚵🏻复杂度分析:
时间复杂度: O(n * 2^n), 假设数组的长度为 n, 一共有 2^n 个叶子节点,也就是 2^n 个子集,每个子集需要拷贝当前的路径(最坏的长度为 n)到最终的结果列表,总的时间复杂度为 O(n * 2^n)
空间复杂度: O(n * 2^n), 一共有 2^n 个子集,每个子集的最坏长度为 n, 总的空间复杂度为 O(n * 2^n)