给定一个含不同整数的集合,返回其所有的子集
注意事项
子集中的元素排列必须是非降序的,解集必须不包含重复的子集
如果 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; } } }