LeetCode 78. 子集

这篇博客介绍了如何使用深度优先搜索(DFS)解决寻找整数数组所有子集的问题。示例展示了当输入为[1,2,3]时,输出所有可能的子集,包括空集。文章通过递归实现深搜,每次添加一个元素到队列中进行枚举,确保不重复。最后,博客提供了完整的Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

78. 子集

难度 中等

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

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

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

题解

​ 这道题是一道求自己题目,就是求出所有子集。如果没有接触过深搜进行求解,那可能有点难求解这道题。

​ 很多时候深搜和递归挺容易混淆的,确实我也没办法说明两个的区别,应该说深搜是递归的一种。在刷题的时候,我经常用深搜进行暴力枚举,确实深搜可以搜索所有结果集,只要多加以判断就可以把结果搜索出来,这也是深搜的魅力(如果没有好的办法,这确实是个解题的办法)。

​ 为什么这道题可以用深搜进行解题,说到底就是因为这道题是个枚举的题目,我们深搜每次都添加一个节点进去枚举,然后加入队列,再添加一个节点进去,再加入队列,重复循环,就可以把所有结果集都加入队列。

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();//存储结果
        int n = nums.length;//数组长度
        Deque<Integer> queue = new ArrayDeque<>(n);//辅助队列
        ans.add(new ArrayList<Integer>(queue));//空集
        for(int i = 0; i < n; i++){
            queue.addLast(nums[i]);//入队一个元素
            dfs(n, i, nums, queue, ans);//继续深搜枚举
            queue.removeLast();//出队一个元素
        }
        return ans;
    }

    //n是长度,k是枚举到第几个元素
    void dfs(int n, int k, int[] nums,  Deque<Integer> queue, List<List<Integer>> ans){
        if(k >= n){//超过数组长度
            return;
        }
        ans.add(new ArrayList<Integer>(queue));//加入新的集合
        for(int i = k + 1; i < n; i++){//每次都从k+1开始,保证不重复枚举前面元素
            queue.addLast(nums[i]);//入队
            dfs(n, i, nums, queue, ans);//继续深搜枚举
            queue.removeLast();//出队
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值