Leetcode--Java--78. 子集

题目描述

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

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

样例描述

示例 1:

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

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

思路

迭代枚举

  1. 每个子集都有空集,先加入空集。
  2. 遍历数组,每来一个新元素就加入到所以的子集形成新的子集在加入到结果集。
  3. 注意遍历结果集时,长度要先提前求出来,不能直接用res.size(),因为res的size不断变大,可能循环超时了。

代码

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
         List<List<Integer>> res = new ArrayList<>();
         //先加入空集
         res.add(new ArrayList<Integer>());
         //对每个新元素,都加入到原来的子集形成新的子集
         for (int num: nums) {
             //提前记录原来的子集长度,如果后面循环直接写res.size()就死循环了 因为size不断变大
             int size = res.size();
             for (int i = 0; i < size; i ++ ) {
             //这里必须new一个,不是直接get,因为要加入新的,是新的引用
                 List<Integer> newSub = new ArrayList<>(res.get(i));
                 newSub.add(num);
                 res.add(newSub);
             }
         }     
         return res;    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值