题目:
给你一个整数数组 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
}