小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
原题:78. 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
解题思路:
因为数组中的元素互不相同,也就是同样的元素只会出现一次,数组中的每个元素都有在子集中「出现」和「不出现」两种情况。
因此,这道题可以这样解决:通过递归的方式,调用数组中的每一个元素,对这个元素依次执行两种处理:
- 第一中,先将该元素加入子集后,递归调用下一个元素,然后再从子集中将该元素移除,也就是恢复状态。
- 第二种,直接递归调用下一个元素。
递归的终止条件是遍历完给定数组中的所有元素,此时,不管自己中包含了哪些元素,将其加入最终的结果集中。
为了保存最终的结果集以及递归过程中子集的状态,定义两个变量:
List<List<Integer>> result = new ArrayList<>();
List<Integer> seq = new ArrayList<>();
其中,result 代表最终的结果集,seq 代表子集。
最终代码:
class Solution {
List<List<Integer>> result = new ArrayList<>();
List<Integer> seq = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(0, nums);
return result;
}
private void dfs(int curr, int[] nums) {
if (curr == nums.length) {
result.add(new ArrayList<>(seq));
return;
}
seq.add(nums[curr]);
dfs(curr + 1, nums);
seq.remove(seq.size() - 1);
dfs(curr + 1, nums);
}
}
递归函数中,curr 代表当前遍历到的数组元素下标,nums 代表给定的整数数组。