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

更新于:2021年2月27日

浏览量:180

开启你的职业生涯

完成课程获得认证

开始学习
广告