/* * 90. Subsets II
*12.16 by Mingyang * 这里我们将后面重复的部分算进来,就是当有重复出现的时候,结果不能重复,我就加了一个boolean array * 1.长度标准:从空集,到本身长度的集合 * 2.可选的范围:从start开始到最后一个 * 3.往前走一步:item加一个,然后start加1表示从下一位加起,然后count也减一个 * 4.后退一步:不用,因为传进去是string,不会对当前状态进行影响 * 5.特别的case:count小于等于0 * 6.关于重复:这里有重复出现,所以多了boolean array */ public static List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); ArrayList<Integer> item = new ArrayList<Integer>(); if (nums.length == 0 || nums == null) return res; Arrays.sort(nums); boolean[] array = new boolean[nums.length]; for (int len = 1; len <= nums.length; len++) dfs3(nums, 0, len, item, res, array); res.add(new ArrayList<Integer>()); return res; } public static void dfs3(int[] S, int start, int len, List<Integer> item,List<List<Integer>> res, boolean[] array) { if (item.size() == len) { res.add(new ArrayList<Integer>(item)); return; } for (int i = start; i < S.length; i++) { if (i != 0 && S[i] == S[i - 1] && array[i - 1] == false)//这句非常关键,表示出了第一个以外,所有的跟前面一样的,并且前面还没用过(多半用了被重新还原的) continue; item.add(S[i]); array[i] = true; dfs3(S, i + 1, len, item, res, array); item.remove(item.size() - 1); array[i] = false; } }