var subsetsWithDup = function(nums) {
let res = [[]];
let begin = 0;
我的代码效率很低只有30%
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsetsWithDup = function(nums) {
nums.sort();
arr_l=[[]];
n=nums.length;
arr=[];
for(var i=1;i<=nums.length;i++){
search(nums,i);
}
function search(nums1,i){
if(i==1){
for(var j=0;j<nums1.length;j++) {
//push number to arr
// push arr to arr_l
// pop the arr laster number;
arr.push(nums1[j]);
flag=0;
for (k = 0; k < arr_l.length; k++) {
fflag=0;
if(arr_l[k].length!=arr.length){
continue;
}
for(l=0;l<arr.length;l++){
if (arr[l] != arr_l[k][l]) {
fflag = 1;
break;
}
}
if(fflag==1){
continue;
}else{
flag=1;
break;
}
}
if (flag == 0) {
arr_l.push(arr.slice());
}
arr.pop();
}
return;
}
for(var j=0;j<nums1.length-1;j++){
arr.push(nums1[j]);
search(nums1.slice(j+1),i-1);
arr.pop();
}
}
return arr_l;
};
下面是第一的,我没分析什么原因
// 排序
nums.sort((a,b) => a - b);
for (let i = 0; i < nums.length; i++){
//如果i等0,且前后两个数字不同,那么begin =0
if (i == 0 || nums[i] != nums[i - 1])
begin = 0;
//size 为res的长度
let size = res.length;
// j从begin开始,到size结束
for (let j = begin; j < size; j++){
//curr为res的j位开始截取
//curr插入nums[i]
//res 插入curr
let curr = res[j].slice();
curr.push(nums[i]);
res.push(curr);
}
begin = size;
}
return res;};