【发布时间】:2022-09-16 11:19:01
【问题描述】:
我正在编写一个函数,它接受一个数组和一个整数并返回一个子数组数组。子数组的数量正是传递给函数的整数。并且子数组必须是连续的,这意味着必须保留数组中项目的原始顺序。也没有子数组可以为空。他们必须至少有一个项目。例如:
const array = [2,3,5,4]
const numOfSubarray = 3
const subarrays = getSubarrays(arraym numOfSubarray)
在这种情况下subarrays 是这样的:
[
[[2, 3], [5], [4]],
[[2], [3, 5], [4]],
[[2], [3], [5, 4]],
]
这是我的尝试:
function getSubarrays(array, numOfSubarray) {
const results = []
const recurse = (index, subArrays) => {
if (index === array.length && subArrays.length === numOfSubarray) {
results.push([...subArrays])
return
}
if (index === array.length) return
// 1. push current item to the current subarray
// when the remaining items are more than the remaining sub arrays needed
if (array.length - index - 1 >= numOfSubarray - subArrays.length) {
recurse(
index + 1,
subArrays.slice(0, -1).concat([subArrays.at(-1).concat(array[index])])
)
}
// 2. start a new subarray when the current subarray is not empty
if (subArrays.at(-1).length !== 0)
recurse(index + 1, subArrays.concat([[array[index]]]))
}
recurse(0, [[]], 0)
return results
}
现在它似乎正在工作。但我想知道什么是时间/空间复杂度这个算法的。我认为它肯定比O(2^n) 慢。有什么办法可以改善吗?或者我们可以用来改进算法的任何其他解决方案?
-
为什么你\"认为它肯定比O(2^n)\"慢吗?
-
你知道有多少个“子数组”吗?这会给你一个复杂性的下限。
-
[2], [3], [5]也是有效的子数组吗?还是子数组必须不相交并且联合必须等于原始数组的约束之一? -
在您的示例中,您没有返回子数组数组,而是返回子数组数组(3D)。问题实际上是关于返回所有有效的子数组组合吗?我认为此时问题太多了,所以请给我们一个正式的问题定义。
-
在您的示例中,为什么
[[2], [3, 5], [4]]不是一个有效的子数组?这是错字吗?
标签: javascript arrays algorithm recursion big-o