0
点赞
收藏
分享

微信扫一扫

LeeCode 78. 子集

女侠展昭 2022-04-24 阅读 77

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();//出队
        }
    }
}
举报

相关推荐

0 条评论