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
广告