(lintcode)第17题 子集

本文介绍了一种生成所有可能子集的算法实现,并针对子集必须是非降序且不含重复的要求进行了改进。通过先对输入数组排序,确保了生成的子集符合题目要求。

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

要求:给定一个含不同整数的集合,返回其所有的子集

注意事项:子集中的元素排列必须是非降序的,解集必须不包含重复的子集。

样例

如果 S = [1,2,3],有如下的解:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

思路:不考虑非降序,一个个数字插进去,每一层插进去一个,每一个都有两种情况,加进去和不加进去。就是遍历数组里面所有的元素,每次取出第一个list,往里面加入,或者不加入,就有了两种情况的list产生,再把这两种list加进去,依次循环。

 

这样的做法是降序的,不符合题意,但是在此处还是贴一下代码。

 

public class Solution {
    
    /*
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    public List<List<Integer>> subsets(int[] nums) {
        // write your code here
        ArrayList<List<Integer>> res=new ArrayList<List<Integer>>();
        ArrayList<Integer>list=new ArrayList<Integer>();
        if(nums==null ||nums.length == 0){
            return res;
        }
        res.add(list);
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<Math.pow(2,i);j++){
                List<Integer>temp=res.get(0);
                res.remove(0);
                ArrayList<Integer>temp2=new ArrayList<Integer>(temp);
                temp2.add(temp2.size(),nums[i]);
                res.add(temp2);
                res.add(temp);
            }
        }
        return res;
    }
}

我们看到上面代码的错误样例如下:

 

 

输入
 
 
[4,1,0]
输出
 
[[],[0],[1],[1,0],[4],[4,0],[4,1],[4,1,0]]
期望答案
 
 
[[],[0],[0,1],[0,1,4],[0,4],[1],[1,4],[4]]

为什么会这样子呢,其实非降序这个要求只是一个幌子,我们只要在加入之前对数组进行排序就可以通过啦。

 

代码如下:

 

public class Solution {
    
    /*
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    public List<List<Integer>> subsets(int[] nums) {
        // write your code here
        ArrayList<List<Integer>> res=new ArrayList<List<Integer>>();
        ArrayList<Integer>list=new ArrayList<Integer>();
        if(nums==null ){
            return res;
        }
        res.add(list);
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<Math.pow(2,i);j++){//每一层的个数都是2的n次方
                List<Integer>temp=res.get(0);
                res.remove(0);//把第一个取出来
                ArrayList<Integer>temp2=new ArrayList<Integer>(temp);
                temp2.add(temp2.size(),nums[i]);
                res.add(temp2);//加入一个数,放进去
                res.add(temp);//不加数,放进去
            }
        }
        return res;
    }
}

如果有所帮助,脸皮厚求个赞~

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使缓慢,驰而不息。

公众号:秦怀杂货店

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值