题:有一个数组,求数组所有的幂集。
示例:nums = [1,2,3]
[
[3],
[2],
[1],
[1,2,3],
[2,3],
[1,2],
[]
]
我的答案:
解题思路:递归
先获取长度为1的幂集
之后以此幂集为出发点,取出一个对象 从nums不包含此对象的剩余的候选项中增加一个数字到此中 形成一个新的对象 如果此对象未被记录则保存
之后以此幂集为出发点,取出一个对象 从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},用一棵二叉树来表示。
集合{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]