LeetCode - 78. 子集

188 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。


原题: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 代表给定的整数数组。