获取数组的子集数组

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

获取数组的⼦集数组
⼀般算法结合数组的都逃不出数组的各种组合和过滤,组合完成了,过滤⾃然简单。

题⽬:根据⼀个数组求它的所有⼦数组集合。

如[1,2,3] => [1] [2] [3] [1,2] [1,3] [2,3] [1,2,3]
解法⼀: 以数组长度为维度,⼦数组的长度范围是1 ⾄ arr.length,将每⼀轮长度的⼦集合并在⼀起即可。

var arr = [1,2,3,4,5,6,9];
var result = []
function getArrList(arr) {
for (let i = 1; i <= arr.length; i++) {
// getArrByLen 参数 arr: 原始数组、[]:上⼀轮结果、start:取item的起始位置、leftLength:⽬标数组的剩余空间
getArrByLen(arr, [], 0, i)
}
return result
}
function getArrByLen(originArr, prevArr = [], start, leftLength) {
for (let i = start; i < originArr.length; i++) {
let target = clone(prevArr);
let curLeft = leftLength
target.push(originArr[i])
if (--curLeft > 0) {
getArrByLen(arr, clone(target), i + 1, curLeft)
} else {
result.push(target)
}
}
}
function clone(arr) {
return [].concat(arr);
}
getArrList(arr)
解法⼆:获取全部长度的⼦集
var arr = [1, 2, 3];
function desArr(arr) {
if (arr.length == 0) {
return []
}
var target = arr.shift()
return add(desArr(arr), target)
}
function add(list, target) {
for (var i = 0, len = list.length; i < len; i++) {
var newItem = clone(list[i])
newItem.push(target)
list.push(newItem)
}
list.push([target])
return list
}
function clone(arr) {
return [].concat(arr);
}
console.log(desArr(arr))
总结:两种⽅法都离不开递归的思想,第⼀种⽅法相当于给数组加了挑选item的条件,从源数组的什么位置开始,上⼀轮结果是啥,剩余多少空间,如仍有多余空间则继续递归。

第⼆种⽅法则是先将数组元素⼀个⼀个拆散,拆到最后为空数组开始重新组装,基于上次的数组重新循环添加新的元素,所以看add⾥list有两次push。

⼀次是单个元素,⼀次则是该单个元素添加进上⼀轮结果的每个item⾥。

相关文档
最新文档