给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

 

思路:

在上一题的基础上 有重复的数字 先排序 然后对重复的元素  顺移到下一个位置

public List<List<Integer>> subsetsWithDup(int[] nums) {
		List<List<Integer>> res = new ArrayList<>();
		ArrayList<Integer> list = new ArrayList<>();
		if (nums.length == 0 || nums == null) {
			return res;
		}
		Arrays.sort(nums); // 排序
		dfs(nums, 0, list, res); // 递归调用
		res.add(new ArrayList<>());// 最后加进来空集
		return res;

	}
	// [1, 2, 3]
	private static void dfs(int[] nums, int start, List<Integer> list, List<List<Integer>> res) {
		for (int i = start; i < nums.length; i++) {
			list.add(nums[i]);
			// item是以整数为元素的动态数组,而res是以数组为元素的数组,
			// 在这一步,当item增加完元素后,item所有元素构成一个完整的子串,再由res纳入
			res.add(new ArrayList<>(list));
			dfs(nums, i + 1, list, res);
            for (int j = i + 1; j < nums.length; j++)
				if (nums[i] == nums[j])
					i++;
				else
					break;
			list.remove(list.size() - 1);
		}
	}