【Leetcode 热题 100】78. 子集

问题背景

给你一个整数数组 n u m s nums nums,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 10 1 \le nums.length \le 10 1≤nums.length≤10
  • − 10 ≤ n u m s [ i ] ≤ 10 -10 \le nums[i] \le 10 −10≤nums[i]≤10
  • n u m s nums nums中的所有元素 互不相同

解题过程

子集问题同样可以考虑每个位置上选或不选,或者每一次选哪个元素。

具体实现

选或不选

java 复制代码
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        dfs(0, nums, path, res);
        return res;
    }

    private void dfs(int i, int[] nums, List<Integer> path, List<List<Integer>> res) {
        if(i == nums.length) {
            res.add(new ArrayList<>(path));
            return;
        }
        dfs(i + 1, nums, path, res);
        path.add(nums[i]);
        dfs(i + 1, nums, path, res);
        path.remove(path.size() - 1);
    }
}

选哪一个

java 复制代码
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        dfs(0, nums, path, res);
        return res;
    }

    private void dfs(int i, int[] nums, List<Integer> path, List<List<Integer>> res) {
        res.add(new ArrayList<>(path));
        // 注意 j 要从 i 开始枚举,不要走回头路
        for(int j = i; j < nums.length; j++) {
            path.add(nums[j]);
            dfs(j + 1, nums, path, res);
            path.remove(path.size() - 1);
        }
    }
}
相关推荐
Coovally AI模型快速验证8 分钟前
清华发布Hyper-YOLO:超图计算+目标检测!捕捉高阶视觉关联
人工智能·算法·yolo·机器学习·目标跟踪·超图计算
h0l10w22 分钟前
LeetCode【剑指offer】系列(数组篇)
c++·算法·leetcode
就爱学编程22 分钟前
力扣刷题:栈和队列OJ篇(上)
算法·leetcode·职场和发展
岸榕.23 分钟前
389 摆花
数据结构·c++·算法
小江村儿的文杰29 分钟前
形象地理解UE4中的数据结构 TLinkedListBase
数据结构·ue4
狄加山67535 分钟前
数据结构(链式队列)
数据结构
狄加山67536 分钟前
数据结构(哈希表)
数据结构·散列表
LDG_AGI1 小时前
【深度学习】多目标融合算法—样本Loss提权
人工智能·深度学习·神经网络·算法·机器学习·迁移学习·推荐算法
扫地羊1 小时前
C语言插入排序及其优化
c语言·算法·排序算法
Milk夜雨1 小时前
头歌实训数据结构与算法-二叉树及其应用(第9关:二叉树的顺序存储及基本操作)
开发语言·数据结构·数据库·c++·算法