思路
跟子集解法一样,需要去重(减枝,优化算法),增加的步骤是先排序,判断是不是跟上一个元素一样,一样就跳过
/*
* @lc app=leetcode.cn id=90 lang=javascript
*
* [90] 子集 II
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsetsWithDup = function (nums) {
let result = []
// 增加排序
nums.sort((a, b) => {
return a - b
})
function backtrack(start, curr) {
result.push([...curr])
for (let i = start; i < nums.length; i++) {
// 判断是不是跟上一个一样,一样就跳过,例[1,2],[1,2]
if (i > start && nums[i] === nums[i - 1]) {
continue
}
// 1.将其push进去
curr.push(nums[i])
// 2.递归调用
backtrack(i + 1, curr)
// 3.把数组的最后一位删除
curr.pop()
}
}
// 调用函数从0开始,把空数组push进去
backtrack(0, [])
return result
}
// @lc code=end