java数据结构与算法刷题-----LeetCode78. 子集

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

解题思路:时间复杂度O( n ∗ 2 n n*2^n n2n),2的n次方是因为每个数都有2种状态。空间复杂度O(n)
  1. 对于每一个数字,都有两种选择,入集合,和不入集合
  2. 用[1,2,3]举例,每个数字都不入,就是空集,都入,就是满集[1,2,3]
  3. 依次判断每个数字
  1. 先取1,我们先入集合, 然后2,入集合,3入集合,此时产生满集[1,2,3]
  2. 回到3,选择不入集合,此时产生[1,2]
  3. 回到2,选择不入集合,3入集合,产生[1,3]
  4. 再次回到3,选择不入集合,产生[1]
  5. 回到1,选择不入集合,2选择入,3选择入,产生[2,3]
  6. 回到3,选择不入集合,产生[2]
  7. 回到2,选择不入集合,3选择入,产生[3]
  8. 回到3,选择不入集合,产生空集[]
  1. 最终这个例子的结果为
    在这里插入图片描述
代码

在这里插入图片描述

class Solution {
    List<Integer> t = new ArrayList<Integer>();//某个子集
    List<List<Integer>> ans = new ArrayList<List<Integer>>();//所有子集

    public List<List<Integer>> subsets(int[] nums) {//程序入口
        dfs(0, nums);//从起始位置0开始回溯
        return ans;
    }

    public void dfs(int cur, int[] nums) {
        if (cur == nums.length) {//如果cur已经到最后一个了就说明枚举完成了一个子集
            ans.add(new ArrayList<Integer>(t));
            return;
        }
        t.add(nums[cur]);//将当前值加入当前子集
        dfs(cur + 1, nums);//进行下一个值的判断,入集或不入
        t.remove(t.size() - 1);//入集逻辑已经枚举完成了,这里开始当前cur不入集合的枚举
        dfs(cur + 1, nums);//当前cur不入集合,直接处理下一个
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值