LeetCode78求集合的子集,集合是不重复的。

题目:

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());
		
	}

}

两者的运行时间差不多,没有很大区别。

猜你喜欢

转载自blog.csdn.net/ata_123/article/details/79978468