leetcode第90子集 II

49 阅读1分钟

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

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 题目链接

我的JavaScript解法

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsetsWithDup = function(nums) {
  nums.sort((a, b) => a - b);
 let result = [];
 let stack = [];
 backtrack(nums, 0, stack, result);
 return result;
};

const backtrack = (nums, startIndex, stack, result) => {
  result.push([...stack]);
  for (let i = startIndex; i < nums.length; i++) {
    // pruning 值相同的相邻树枝,只遍历第一条
    if(i > startIndex && nums[i] == nums[i-1])
      continue;
    stack.push(nums[i]);
    backtrack(nums, i+1, stack, result);
    stack.pop();
  }
}

解析: 回溯法+剪枝

  • 时间复杂度: O(kn)O(k^n), kk 为不同元素的个数(有待商榷)