题目:
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
求其所有的集合,首先得办法就是递归,包含这个数的所有子集,和不包含这个数的所有子集。
递归的方法如下:
package leetcode;
import java.util.ArrayList;
import java.util.List;
public class LC78SubSetsII {
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
int len = nums.length;
if(len == 0){
return ret;
}
List<Integer> sub = new ArrayList<Integer>();
subget(nums,0,ret,sub);
return ret;
}
public static void subget(int[] nums,int index,List<List<Integer>> ret,List<Integer> sub){
if(index == nums.length){
ret.add(sub);
return;
}
subget(nums,index+1,ret,sub);//不要这个数
List<Integer> list = new ArrayList<Integer>(sub);
list.add(nums[index]);//要这个数
subget(nums,index+1,ret,list);
}
public static void main(String[] args) {
int[] nums={1,2,3};
List<List<Integer>> list = subsets(nums);
for(int i =0;i<list.size();i++){
for(int j =0;j<list.get(i).size();j++){
System.out.print(list.get(i).get(j));
}
System.out.println();
}
System.out.println(list.size());
}
}
不用递归的办法如下:
package leetcode;
import java.util.ArrayList;
import java.util.List;
public class LC78SubSets {
public static List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
int len = nums.length;
for(int i=0;i<len;i++){
int n = ret.size();
for(int j=0;j<n;j++){
List<Integer> temp = ret.get(j);
List<Integer> list = new ArrayList<Integer>();
for(int k=0;k< temp.size();k++){
list.add(temp.get(k));
}
list.add(nums[i]);
ret.add(list);
}
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
ret.add(list);
}
List<Integer> list = new ArrayList<Integer>();
ret.add(list);
return ret;
}
public static void main(String[] args) {
int[] nums={1,2,3};
List<List<Integer>> list = subsets(nums);
for(int i =0;i<list.size();i++){
for(int j =0;j<list.get(i).size();j++){
System.out.print(list.get(i).get(j));
}
System.out.println();
}
System.out.println(list.size());
}
}
两者的运行时间差不多,没有很大区别。