Lintcode17 子集

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

 注意事项

子集中的元素排列必须是非降序的,解集必须不包含重复的子集

样例

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

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

] 思路:求n个数的子集等于求前n-1个数的子集和这最后一个数构成的子集,运用递归求解代码如下: 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         //用来存放nums前n-1个数         int[] array=null;         //n表示nums数组的最后一个数 int n = 0; //array数组的长度 int array_len = nums.length-1;         List<Integer> num = new ArrayList<Integer>();         List<List<Integer>> list = new ArrayList<List<Integer>>();         if(nums==null||nums.length==0){             list.add(num);             return list;         }         //当只有一个数时,子集是本身和空集         if(nums.length==1){             num.add(nums[0]);             list.add(num);             list.add(new ArrayList<Integer>());             return list;         }else{         //将这n个数的前n-1个数存到array数组中         array = new int[array_len];             for(int i = 0;i<array_len;i++){                 array[i]=nums[i];             }             //递归调用函数返回子集的List             list = subsets(array);             //size表示第n个数插入前list的大小             int size = list.size();                          //对list中的每一个子集插入第n个数             for(int j=0;j<size;j++){                 //num表示list中的一个子集             num = list.get(j);                         //num_size表示list的一个子集大小也就是num的大小             int num_size = num.size();                         //不能直接赋值,否则temp是num的引用,对temp的操作也就是对num的操作             List<Integer> temp  = new ArrayList<Integer>(num);             // List<Integer> temp  = new ArrayList<Integer>();             //temp.addAll(num);             n = nums[array_len];                 temp.add(n);                 //重新排列                 Collections.sort(temp);                              if(list.contains(temp))                 continue;                 else                     list.add(temp);                        }                      return list;                  }     } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值