求数组所有的幂集——java

题:有一个数组,求数组所有的幂集。
示例:nums = [1,2,3]
[
[3],
[2],
[1],
[1,2,3],
[2,3],
[1,2],
[]
]

我的答案:
解题思路:递归
先获取长度为1的幂集
之后以此幂集为出发点,取出一个对象 从nums不包含此对象的剩余的候选项中增加一个数字到此中 形成一个新的对象 如果此对象未被记录则保存
之后在以长度增加了1的幂集驱动 获取下一个长度+1的幂集 直到长度无法增加为止
最后将其全部收集 即得到所有的幂集
public static void main(String[] args) throws Exception {
		int[] nums = {1,2,3};
		List<List<Integer>> results = new ArrayList<>();
		List<Integer> numlist = new ArrayList<>();
		for(int i = 0; i < nums.length; ++ i){
			numlist.add(nums[i]);
			
			List<Integer> l = new ArrayList<>(1);
			l.add(nums[i]);
			results.add(l);
		}
		List<List<Integer>> all = new ArrayList<>(results);
		miji(numlist, results, all);
		all.add(new ArrayList<Integer>());//补充空集
		System.out.println(all);
	}
	
	/**
	 * @param rs 只有某值的list
	 * */
	public static void miji(List<Integer> nums, List<List<Integer>> rs, List<List<Integer>> all){
		List<List<Integer>> results = new ArrayList<>();//多了一个值的list
		
		List<Integer> copy = new ArrayList<>(nums);
		for(List<Integer> r : rs){
			copy.removeAll(r);
			if(copy.isEmpty()){
				return;
			}
			for(int c : copy){//剩余元素 每个取剩余的加一个
				List<Integer> l = new ArrayList<>(r);
				l.add(c);
				System.out.println(l);
				results.add(l);
				boolean has = false;
				for(List<Integer> a : all){
					if(toStr(a).equals(toStr(l))){
						has = true;
						break;
					}
				}
				if(!has){
					all.add(l);
				}
			}
			copy.addAll(r);
		}
		rs.addAll(results);
		miji(nums, results, all);
	}
	
	private static String toStr(List<Integer> r){
		Collections.sort(r);
		String s = "";
		for(int i : r){
			s += i + ",";
		}
		return s;
	}
输出结果:
[1, 2]
[1, 3]
[2, 3]
[2, 1]
[3, 1]
[3, 2]
[1, 2, 3]
[1, 3, 2]
[2, 3, 1]
[1, 2, 3]
[1, 3, 2]
[2, 3, 1]
[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3], []]

参考答案:
集合中的每个元素只有两种状态:属于幂集的元素集或不属于幂集的元素集。 
集合{1,2,3},用一棵二叉树来表示。 
这里写图片描述
实现代码:
public static void main(String[] args) {
		int[] nums = {1,2,3};
		int[] c = new int[nums.length];
		miji(nums, c, 0);
	}
	
	private static void miji(int[] nums, int[] c, int position){
		if(position >= nums.length){
			return;
		}
		int i = nums[position];
		c[position] = i;//读取这个数
		System.out.println(toStr(c));
		miji(nums, c, position + 1);
		c[position] = 0;//未读取这个数
		miji(nums, c, position + 1);
	}
	
	private static String toStr(int[] ar){
		List<Integer> r = new ArrayList<>();
		for(int i : ar){
			if(i != 0){
				r.add(i);
			}
		}
		Collections.sort(r);
		return r.toString();
	}
运行结果:
[1]
[1, 2]
[1, 2, 3]
[1, 3]
[2]
[2, 3]
[3]



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值