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

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.