LeetCode 90 子集 II

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

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

解题:

func subsetsWithDup(nums []int) [][]int {
	sort.Ints(nums)
	var r [][]int
	tmp := make([]int, 0)
	r = append(r, tmp)
	l := len(nums)
	var df func(i int)
	df = func(i int) {
		if i >= l {
			return
		}
		tmp = append(tmp, nums[i])
		a := make([]int, len(tmp))
		copy(a, tmp)
		r = append(r, a)
		df(i + 1)
		tmp = tmp[:len(tmp)-1]
		i++
		for i < l && nums[i-1] == nums[i] {
			i++
		}
		df(i)
	}
	df(0)
	return r
}

官方解答:

1.迭代法实现子集枚举

func subsetsWithDup(nums []int) (ans [][]int) {
	sort.Ints(nums)
	n := len(nums)
outer:
	for mask := 0; mask < 1<<n; mask++ {
		var t []int
		for i, v := range nums {
			if mask>>i&1 > 0 {
				if i > 0 && mask>>(i-1)&1 == 0 && v == nums[i-1] {
					continue outer
				}
				t = append(t, v)
			}
		}
		//ans = append(ans, append([]int(nil), t...))
		ans = append(ans, t)
	}
	return
}

2.递归法实现子集枚举

func subsetsWithDup(nums []int) (ans [][]int) {
	sort.Ints(nums)
	var t []int
	var dfs func(bool, int)
	dfs = func(choosePre bool, cur int) {
		if cur == len(nums) {
			ans = append(ans, append([]int(nil), t...))
			return
		}
		dfs(false, cur+1)
		if !choosePre && cur > 0 && nums[cur-1] == nums[cur] {
			return
		}
		t = append(t, nums[cur])
		dfs(true, cur+1)
		t = t[:len(t)-1]
	}
	dfs(false, 0)
	return
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注