90. 子集 II(JavaScript)

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

思路:

这道题的前身:78.子集,输入的数组不包含重复元素。而这道题包含重复元素,如果继续按照78那道题的解法,解集中必然会包含重复的元素,因此在将子集加入结果数组中需要多加一道判断,当结果数组中存在子集元素时,就不加入。

如何判断一个二维数组中是否含有某个一维数组?看这里:二维数组是否包含一维数组

理清楚之后,就很简单了。

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsetsWithDup = function(nums) {
  var result =[[]];     // 结果数组
  for (var num of nums.sort()) {
    var temp = [];      // 每个num,添加进result每个元素后,形成的二维数组
    for (var already of result) {
      var element = already.concat(num);  // element:temp的每个元素,即result里的每个元素加上num
      if (!arrayHasElement(result, element)) {  // 若element不存在与result中,添加element。
        temp.push(element);
      }
    }
    result = result.concat(temp);
  }
  return result;
};


/**
 * @param {number[][]} array
 * @param {number[]} element
 * @return {boolean}
 */
var arrayHasElement = function(array, element) {  // 判断二维数组array中是否存在一维数组element
  for (var el of array) {
    if (el.length === element.length) {
      for (var index in el) {
        if (el[index] !== element[index]) {
          break;
        }
        if (index == (el.length - 1)) {
          return true;
        }
      }
    }
  }
  return false;
}

猜你喜欢

转载自blog.csdn.net/romeo12334/article/details/81487543