90.子集 II

57 阅读1分钟

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

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
算法:
关键如何去重,以重复的数字为出发点考虑

func subsetsWithDup(nums []int) [][]int {
	ans := make([][]int, 0)
	// ans = append(ans, []int{})
	result := make([]int, 0)
	var backtracking func(index int, preSelected bool )
	backtracking = func(index int, preSelected bool ) {
		if index == len(nums) {
			ans = append(ans, append([]int{}, result...))
			return
		}
		// 不选择nums[index]
		backtracking(index + 1, false)
		if !preSelected && index > 0 && nums[index - 1] == nums[index] {
			return
		}
		// 选择nums[index]
		result = append(result, nums[index])
		backtracking(index + 1, true)
		result = result[:len(result)-1]
		
	}
	sort.Slice(nums, func(i, j int) bool {
		return nums[i] < nums[j]
	})
	backtracking(0, false)

	return ans

}