回溯

子集

中等#78Java时间 O(n·2ⁿ)空间 O(n),不计结果

题目要做什么

返回互异数组的全部子集,包括空集。子集内保持原数组顺序,结果顺序不限。

题目示例输入nums = [1,2,3]
题目示例输出[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]

01 为什么这样做

每个递归状态本身就是一个子集。只从 start 之后选择下一项,使下标严格递增,从而避免相同子集以不同顺序重复出现。

始终成立的条件

path 下标递增,下一选择只来自 start 及之后。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public List<List<Integer>> subsets(int[] nums) {3        List<List<Integer>> result = new ArrayList<>();4        search(nums, 0, new ArrayList<>(), result);5        return result;6    }7    private void search(int[] nums, int start, List<Integer> path, List<List<Integer>> result) {8        result.add(new ArrayList<>(path));9        for (int i = start; i < nums.length; i++) {10            path.add(nums[i]);11            search(nums, i + 1, path, result);12            path.remove(path.size() - 1);13        }14    }15}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索