给定一个可能包含重复元素的整数数组 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;
}