子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
思路:这依然是一道排列组合的题目,定义一个标记数组,表示每个元素取不取,具体看代码:
package 中级回溯; import java.util.ArrayList; import java.util.List; public class 子集 { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> list = new ArrayList<>(); List<Integer> single = new ArrayList<>(); //标记数组 boolean[] a = new boolean[nums.length]; digui(list,single,nums,a,0); return list; } public static void digui(List<List<Integer>> list,List<Integer> single,int[] nums,boolean[] a,int n) { if (n == nums.length) { //吧标记了取的元素放进single队列里 for (int i = 0; i < a.length; i++) { if (a[i]) { single.add(nums[i]); } } //注意一定要new一个,不然只是复制一个引用 list.add(new ArrayList<Integer>(single)); //清空队列 single.removeAll(single); return; } else { //取n的情况,准备看下一个 a[n] = false; digui(list, single, nums, a, n+1); //不取n的情况,看下一个 a[n] =true; digui(list, single, nums, a, n+1); } } }