我正在尝试编写一个函数,它将接受一个数组和 n 作为参数,
它将返回包含 n 个元素的数组的所有子集,已经尝试了一些方法,但尚未成功。
感谢把它放在这里的人,这个函数太复杂了,不能完成工作,基本上我在这里尝试做的是从 4 元素数组中挑选一个元素来创建它的 3 元素子集。它甚至不采用 N 作为参数。它返回所有 3 个元素子集,但也返回相同的子集,所以我也必须将它们过滤掉,无论如何我都会继续尝试。
function findSubsets(array) {
var answers = [];
var firstArray = array;
for (i = 0; i < array.length; i++) {
array = firstArray;
for (var k = 0; k < array.length; k++) {
if (k != i) {
var subset = array.splice(k, 1);
answers.push(array); array.splice(k, 0, subset[0]);
}
}
}
}
这并不像看起来那么复杂。这个是经过优化的,因为它在此过程中不会创建无用的临时数组。
function findSubsets(array, n) {
var answers = [];
for(var i = 0 ; i < array.length ; i += n) {
answers.push(array.slice(i, i + n));
}
return answers;
}
findSubsets([1, 2, 3, 4, 5, 6, 7, 8, 9], 2) // --> [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
findSubsets([1, 2, 3, 4, 5, 6, 7, 8, 9], 3) // --> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
您可以尝试这个解决方案
var subsetArray = (function() {
return {
getResult: getResult
}
function getResult(array, n) {
function isBigEnough(value) {
return value.length === n;
}
var ps = [
[]
];
for (var i = 0; i < array.length; i++) {
for (var j = 0, len = ps.length; j < len; j++) {
ps.push(ps[j].concat(array[i]));
}
}
return ps.filter(isBigEnough);
}
})();
var arr = [1, 2, 3, 4,5,6,7,8,9]; console.log(subsetArray.getResult(arr,2));
问题陈述:
对于给定的一维数字数组,找到所有可能的子集
具有特定长度的数组,例如
对于数组 [1,2,3] 如果我们想找到长度为 2 的所有子集那么
输出应该是
[
[1,2],
[1,3],
[2,3]
]
解决方案:
function getAllSubsetsOfSpecificLength(array, length) {
const subsets = [[]];
const subsetsOfSpecificLength = [];
for (const el of array) {
const last = subsets.length - 1;
for (let i = 0; i <= last; i++) {
let set = [...subsets[i], el];
subsets.push(set);
if (set.length == length) {
subsetsOfSpecificLength.push(set);
}
if (set.length > length) {
break;
}
}
}
return subsetsOfSpecificLength;
}
let array = [1, 2, 3];
let result = getAllSubsetsOfSpecificLength(array, 2);
console.log(result);
输出:
[ [ 1, 2 ], [ 1, 3 ], [ 2, 3 ] ]