请编写一个方法,返回某集合的所有非空子集。

 给定一个int数组A和数组的大小int n,请返回A的所有非空子集。保证A的元素个数小于等于20,且元素互异。各子集内部从大到小排序,子集之间字典逆序排序,见样例。
 测试样例:[123,456,789]

 * 返回{[789,456,123],[789,456],[789,123],[789],[456 123],[456],[123]}

 */

1.先写一个算法,请返回A的所有子集(包含空集)。

public ArrayList<ArrayList<Integer>> getSubsets(int[] A, int n) {
		ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
		Arrays.sort(A);
		lists.add(new ArrayList<Integer>());//加入空集。
		int index = 0;
		while (index < n) {			
			// 注意:每次加入集合后会改变原来的集合,无法继续从集合中取出元素。
			// 必须通过一个中间参数moreSubsets来保存中间结果,最后加入allSubsets。
			ArrayList<ArrayList<Integer>> moreSub = new ArrayList<ArrayList<Integer>>();
			for (ArrayList<Integer> set : lists) {
				ArrayList<Integer> newlist = new ArrayList<Integer>();
				newlist.addAll(set);
				newlist.add(0,A[index]);
				moreSub.add(newlist);
			}
			lists.addAll(0, moreSub);//按字典顺序逆序输出
			//lists.addAll(moreSub);按字典顺序输出
			index++;
		}
		return lists;
	}
2.下面介绍:没有空集 且 按字典顺序逆序输出的算法
注意:由于没有了空集,每次都要单独加入自己。遍历原来的集合(加入自己)。

	public ArrayList<ArrayList<Integer>> getSubsets2(int[] A, int n) {
		ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
		Arrays.sort(A);
		int index = 0;
		while (index < n) {
			//遍历原来的集合(加入自己),再单独加入自己(由于没有了空集)。
			//两者没有先后顺序。也可加入自己,再遍历原来的集合
			// 注意:每次加入集合后会改变原来的集合,无法继续从集合中取出元素。
			// 必须通过一个中间参数moreSubsets来保存中间结果,最后加入allSubsets。
			ArrayList<ArrayList<Integer>> moreSub = new ArrayList<ArrayList<Integer>>();
			//lists没有元素的话,直接跳过。
			for (ArrayList<Integer> set : lists) {
				ArrayList<Integer> newlist = new ArrayList<Integer>();
				newlist.add(A[index]);
				newlist.addAll(set);
				moreSub.add(newlist);
			}
			//加入自己
			ArrayList<Integer> list = new ArrayList<Integer>();		
			list.add(A[index]);
			moreSub.add(list);
			lists.addAll(0, moreSub);
			index++;
		}
		return lists;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值