领扣LintCode问题答案-18. 子集 II

领扣LintCode问题答案-18. 子集 II

目录

  • 18. 子集 II
  • 鸣谢

18. 子集 II

给定一个可能具有重复数字的列表,返回其所有可能的子集。
子集中的每个元素都是非降序的
两个子集间的顺序是无关紧要的
解集中不能包含重复子集

样例 1:

输入:[0]
输出:
[
[],
[0]
]

样例 2:

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Solution {
     
	/**
	 * @param nums: A set of numbers.
	 * @return: A list of lists. All valid subsets.
	 */
	public List<List<Integer>> subsetsWithDup(int[] nums) {
     
		// write your code here
		Arrays.sort(nums);
		Set<List<Integer>> ret = new HashSet<>();
		ret.add(new ArrayList<>());
		int[] tRet = new int[nums.length];
		for (int size = 1; size <= nums.length; size++) {
     
			this.subsets(nums, 0, size, ret, tRet, 0);
		}
		return new ArrayList<>(ret);
	}

	private void subsets(int[] nums, int startIndex, int size, Collection<List<Integer>> ret, int[] tRet, int tRetIndex) {
     
		if (tRetIndex >= size) {
     
			List<Integer> t = new ArrayList<>();
			for (int i = 0; i < size; i++) {
     
				t.add(tRet[i]);
			}
			ret.add(t);
			return;
		}
		for (int i = startIndex; i < nums.length; i++) {
     
			tRet[tRetIndex] = nums[i];
			subsets(nums, i + 1, size, ret, tRet, tRetIndex + 1);
		}
	}
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)