225 字
1 分钟
LeetCode-90. 子集 II
回溯
给你一个整数数组
nums,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:
输入:nums = [0]输出:[[],[0]]
手撕
思路:这里很像 47. 全排列 II 的情况,本身不需要used,但是需要判断不同的情况,像1 2 2和1 2的不同,所以需要判断前面的数是否使用,所以引入used
func subsetsWithDup(nums []int) [][]int { sort.Ints(nums)
res := [][]int{} path := []int{} used := make([]bool, len(nums))
var backtrack func(index int) backtrack = func(index int) { res = append(res, append([]int(nil), path...))
for i := index; i < len(nums); i++ { if i > 0 && nums[i] == nums[i-1] && !used[i-1] { continue }
path = append(path, nums[i]) used[i] = true backtrack(i+1) path = path[:len(path)-1] used[i] = false } }
backtrack(0) return res} LeetCode-90. 子集 II
https://sheep44044.github.io/posts/算法/回溯/leetcode-90-子集-ii/