集合的子集
2016-10-10 08:46
197 查看
题目描述
请编写一个方法,返回某集合的所有非空子集。
给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
测试样例:
[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}
请编写一个方法,返回某集合的所有非空子集。
给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
测试样例:
[123,456,789]
返回:{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Subset { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ int n = scanner.nextInt(); int[] A = new int ; for (int i = 0; i < n; i++) { A[i] = scanner.nextInt(); } ArrayList<ArrayList<Integer>> subsets = getSubsets1(A, n); for(int i=0;i<subsets.size();i++){ for(int j=0;j<subsets.get(i).size();j++){ System.out.print(subsets.get(i).get(j) + " "); } System.out.println(); } } } // 方法1 占位法 public static ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) { ArrayList<ArrayList<Integer>> subsets = new ArrayList<ArrayList<Integer>>(); int size = 1 << n;// 子集的大小(算上了空集) for (int i = 0; i < size; i++) { ArrayList<Integer> subList = new ArrayList<Integer>(); int k = i; int index = 0; while (k > 0) { if ((k & 1) == 1) { subList.add(A[index]); } k >>= 1; index++; } Collections.reverse(subList); if (subList.size() > 0) {// 除去空集 subsets.add(subList); } } Collections.reverse(subsets); return subsets; } // 方法2 举个例子一目了然 // 比如 A={1,2,3}; /* * 1.首先生成一个元素的子集sets(1)={{1}}。 * 2.加入元素2,则sets(2)由三部分组成: * (1)在sets(1)的所有子集前边插入当前元素A[1]=2,得{{2,1}}; * (2)A[1]单独作为一个子集{2}; * (3)sets(1)同时也应包含到sets(2)中,sets(2) = {{2,1},{2},{1}}。 * 3.加入元素3,则sets(3)由三部分组成: * (1)在sets(2)的所有子集前边插入当前元素A[2]=3,得{{3,2,1},{3,2},{3,1}}; * (2)A[2]单独作为一个子集{3}; * (3)sets(2)同时也应包含到sets(3)中,sets(3) = {{3,2,1},{3,2},{3,1},{3},{2,1},{2},{1}}。 */ public static ArrayList<ArrayList<Integer>> getSubsets1(int[] A, int n) { Arrays.sort(A);// 先从小到大排序 ArrayList<ArrayList<Integer>> outSet = new ArrayList<ArrayList<Integer>>(); // 表示整体的大集合 ArrayList<Integer> inSet; // 集合元素 if (n == 1) { //递归终止条件 inSet = new ArrayList<Integer>(); inSet.add(A[0]); outSet.add(inSet); return outSet; } ArrayList<ArrayList<Integer>> temp = getSubsets1(A, n - 1); // 取得sets(n-1)集合 for (int i = 0; i < temp.size(); i++) { // 在sets(n-1)的所有子集前边插入当前元素A[n-1] inSet = new ArrayList<Integer>(); inSet.add(A[n - 1]); for (int j = 0; j < temp.get(i).size(); j++) { inSet.add(temp.get(i).get(j)); } outSet.add(inSet); } inSet = new ArrayList<Integer>(); inSet.add(A[n - 1]); // A[n-1]单独作为一个子集 outSet.add(inSet); outSet.addAll(temp);// sets(n-1)同时也应包含到sets(n)中 return outSet; } }
相关文章推荐
- 获取一个集合的所有子集
- 设计算法以判断集合A是否是集合B的子集
- 设S是有n个元素的集合,S的幂集是S所有可能的子集组成的集合。
- javascript集合的交,并,补,子集,长度,新增,删除,清空等操作
- 输出一个集合的全部子集
- 18 m 元素集合的 n 个元素子集
- 求集合的所有子集
- 傻瓜方法求集合的全部子集问题(java版)
- [C++学习笔记] 链表应用1判断一个集和是否为另一个集合的子集
- 位运算之求集合的所有子集
- 【SICP读书笔记(五)】练习2.32 --- 递归求集合子集
- 经典名题2----字典顺序列出集合的子集
- 求集合{1,2,...,n}的长度等于M(M<n)的所有子集
- 集合的子集生成(无重复元素)
- 求集合的所有子集
- JAVA流式组合数算法--集合取子集
- [经典算法] 排列组合-N元素集合的M元素子集
- 用位运算获得集合的所有子集
- 输出集合的所有子集
- C++数据结构--组合学--查找集合的所有子集