JavaScript中能否将数组分成n个和相等的子数组
我们需要编写一个JavaScript函数,该函数接收一个数字数组`arr`作为第一个参数,一个数字`num`作为第二个参数。
该函数应该确定是否存在一种方法可以将数组`arr`的元素分配到`num`个组中,使得所有组的总和相等。如果存在这样的方法,我们的函数应该返回`true`,否则返回`false`。
例如:
如果输入数组和数字是:
const arr = [4, 6, 3, 3, 7, 4, 1]; const num = 4;
那么输出应该是:
const output = true;
因为四个组是:[7],[1, 6],[4, 3],[4, 3]
示例
代码如下:
const arr = [4, 6, 3, 3, 7, 4, 1];
const num = 4;
const canDivide = (arr = [], num = 1) => {
const sum = arr.reduce((acc, num) => acc + num);
if (sum % num !== 0 || arr.some(num => num > sum / num)) {
return false;
}
const used = new Set();
return (function find(start, target) {
if (used.size === arr.length) {
return true;
}
if (target < 0) {
return false;
}
if (target === 0) {
return find(0, sum / num);
}
for (let i = start; i < arr.length; i++) {
if (!used.has(i)) {
used.add(i);
if (find(i + 1, target - arr[i])) {
return true;
}
used.delete(i);
}
}
return false;
})(0, sum / num);
};
console.log(canDivide(arr,num));我们在解决方案中采取的步骤:
步骤1.如果总和不能被`num`整除,或者其中一个数字大于总和/`num`,我们返回`false`。
步骤2.我们使用HashSet来跟踪已使用的数字。
步骤3.我们开始寻找子分区。
如果所有数字都已使用,则完成。
如果子集和过大,我们停止搜索。
如果我们找到一个子集,我们将继续搜索直到使用所有数字。
最后,我们尝试每个未使用的数字。
输出
控制台中的输出将是:
true
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP