[90] 子集 II

47 阅读1分钟

思路

跟子集解法一样,需要去重(减枝,优化算法),增加的步骤是先排序,判断是不是跟上一个元素一样,一样就跳过

/*
 * @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