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或其中一个数字大于sum/num,则返回false。
Step2.We使用HashSet来跟踪使用过的数字。
步骤3.我们开始寻找子分区。
如果使用所有数字,我们就完成了。
如果子集和太大,我们停止搜索。
如果我们找到了一个子集,我们继续搜索,直到我们使用所有数字。
最后,我们尝试了每个未使用的号码。
输出结果
控制台中的输出将是-
true