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

原创 2018年04月17日 18:10:15

题目:

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

}

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

java求无重复集合所有子集

在lintcode上遇到一道题,如下: 给定一个含不同整数的集合,返回其所有的子集 注意事项: 子集中的元素排列必须是非降序的,解集必须不包含重复的子集。...
  • yinglish_
  • yinglish_
  • 2016-09-10 23:32:04
  • 1542

求一个集合子集的算法示例

  • 2014年06月14日 21:26
  • 464KB
  • 下载

【Java】通过位运算求一个集合的所有子集

Java没有自带的求一个集合的所有子集的方法,我们可以通过集合的子集规律来求。 一个集合的所有子集等于2^该集合的长度。比如{c,b,a}的长度为3,这个集合的子集就有8个。 这句话看起来很简单,...
  • yongh701
  • yongh701
  • 2016-12-12 15:50:35
  • 1735

求集合的所有子集(java实现)

代码: import java.io.File; import java.io.FileWriter; import java.io.IOException; /* *Created on 201...
  • caiandyong
  • caiandyong
  • 2015-01-31 22:08:20
  • 1299

求集合的所有子集的算法

求集合的所有子集的算法对于任意集合A,元素个数为n(空集n=0),其所有子集的个数为2^n个如集合A={a,b,c},其子集个数为8;对于任意一个元素,在每个子集中,要么存在,要么不存在,对应关系是:...
  • yzl20092856
  • yzl20092856
  • 2014-10-11 15:30:14
  • 2689

求一个集合的所有子集问题

一个包含n个元素的集合,求它的所有子集。这种问题一般有两种思路,先说说第一种,递归。递归肯定要基于一个归纳法的思想。...
  • pony_maggie
  • pony_maggie
  • 2014-06-15 21:44:56
  • 18867

递归求集合的所有子集的程序

#include #include using namespace std; //算法描述: //1、如果遍历完全集,打印出所有被标记为true的元素 //2、否则: //3、取第de...
  • woaifen3344
  • woaifen3344
  • 2012-04-25 13:01:48
  • 3492

使用递归求出一个集合的所有子集

想一下,平时如果给你1,2,3,4四个数,让你写出它的所有子集,你会怎么做? 我想大部分人的思路是先写出子集中只含有一个元素的子集:1;2;3;4。然后考虑子集中含有两个元素的子集:1,2;1,3;...
  • nkuhjp
  • nkuhjp
  • 2016-09-21 21:05:46
  • 4412

递归求字母集合的子集C++

问题描述: 在txt文件中输入一列字母,找到其子集并显示。 分析: 如果子集不包括空集,一个集合的子集可以表示为前n-1个的子集、前n-1个的子集分别加上最后一个、最后一个 环境:VS...
  • hanshuning
  • hanshuning
  • 2015-08-25 17:54:07
  • 1412

求集合的所有子集 数据结构 严蔚敏

  • 2010年12月15日 20:21
  • 499KB
  • 下载
收藏助手
不良信息举报
您举报文章:LeetCode78求集合的子集,集合是不重复的。
举报原因:
原因补充:

(最多只允许输入30个字)