先来一个直观的例子,比如集合 [1,2,3] ,它的所有子集为 [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]。其中空数组表示空集,其实空集肯定会存在,那么让我们的算法从空集开始。
首先,让我们定义一个结果集 ret =[ [] ], 里面
然后第一步,复制结果集 ,往里面的所有集合加1, [ [1] ], 然后新旧结果集合并,得到 [[],[1]]
然后第二步,复制结果集 ,往里面的所有集合加2, [[],[1]] 变成[[2], [1, 2]], 然后新旧结果集合并,得到 [[], [1], [2], [1, 2] ]
然后第三步,复制结果集 ,往里面的所有集合加3, [[], [1], [2], [1, 2] ]变成[[3],[1, 3], [2, 3] [1, 2, 3]], 然后新旧结果集合并,得到 [[], [1], [2], [1, 2] ,[3],[1, 3], [2, 3] [1, 2, 3]]
用JS代码表示就是
function subsets(nums){
var result = [[]];
for(var i = 0; i < nums.length; i++){
var el = nums[i];
for(var j = 0, n = result.length; j < n; j++){
var newEl = result[j].concat(el);
result.push(newEl);
}
}
return result
}
console.log(subsets([1,2,3]))
在加扣中,还有一题,求不重复的子集,也很类似。
var subsetsWithDup = function(nums) {
var result = [[]], cache = {};
nums.sort()
for(var i = 0; i < nums.length; i++){
var el = nums[i];
for(var j = 0, n = result.length; j < n; j++){
var newEl = result[j].concat(el);
var key = newEl.join('-');
if(!cache[key]){
cache[key] = 1;
result.push(newEl);
}
}
}
//console.log(cache)
return result
};