僅允許旋轉給定陣列的情況下,查詢Sum(i*arr[i])的最大值JavaScript程式


我們將使用一種數學方法來查詢陣列中元素的索引和值的乘積之和的最大值。透過旋轉陣列,我們可以透過將陣列的最大值放在乘積最大的索引處來最大化此和。我們將使用的演算法包括查詢索引和元素值的乘積之和,然後將此和與陣列長度和索引值之和的乘積之間的差新增到此和。

將來,我們將不斷地將此演算法應用於不同的陣列,以查詢僅允許旋轉的情況下元素的索引和值的乘積之和的最大值。此解決方案效率很高,因為它只需要遍歷陣列一次,時間複雜度為 O(n)。使用此演算法,我們可以快速輕鬆地找到陣列中元素的索引和值的乘積之和的最大值。

方法

  • 所有旋轉的總和可以透過將陣列中每個元素與其對應的索引相乘並將結果相加來獲得。

  • 可以透過找到具有最大值的索引並將陣列旋轉使得最大值成為第一個元素來獲得最大值。

  • 可以透過將每個元素的值與其索引相乘並將結果與當前最大值進行比較來找到最大值。

  • 所有旋轉的總和可以透過將所有旋轉的總和新增到當前總和併除以旋轉次數來找到。

  • 最大值可以作為結果返回。

示例

該問題可以透過首先找到陣列中所有元素的總和,然後迭代地旋轉陣列並透過將當前旋轉的差值新增到之前的總和來更新總和來解決。最大和將是答案。這是一個完整的 JavaScript 示例:

function maxSum(arr) {
   let n = arr.length;
   let arrSum = 0;
   let currVal = 0;
   for (let i = 0; i < n; i++) {
      arrSum += arr[i];
      currVal += i * arr[i];
   }
   let maxVal = currVal;
   for (let j = 1; j < n; j++) {
      currVal = currVal + arrSum - n * arr[n - j];
      maxVal = Math.max(maxVal, currVal);
   }
   return maxVal;
}
let arr = [1, 20, 2, 10];
console.log(maxSum(arr)); // Output: 72

解釋

  • 函式maxSum接收一個數組作為輸入,並返回透過旋轉陣列並對每個旋轉取i * arr[i]的和可以獲得的最大和。

  • 變數n儲存陣列的長度。

  • 變數arrSum儲存陣列中所有元素的總和,並初始化為 0。

  • 變數currVal儲存當前旋轉的i * arr[i]的和,並初始化為 0。

  • 第一個迴圈計算陣列中所有元素的總和以及第一次旋轉的i * arr[i]的和。

  • 變數maxVal儲存最大和,並初始化為currVal

  • 第二個迴圈迭代地旋轉陣列並更新每次旋轉的i * arr[i]的和。當前旋轉的i * arr[i]的和透過將當前旋轉的差值新增到之前的總和來更新。

  • currVal的值透過添加當前旋轉的i * arr[i]的和與前一次旋轉的i * arr[i]的和之間的差值來更新。該差值是透過從arrSum中減去n * arr[n - j]來計算的。

  • 使用Math.max函式將每次旋轉的currVal的最大值儲存在maxVal中。

  • 最後,返回maxVal的值作為答案。

更新於:2023年3月15日

瀏覽量:301

開啟你的職業生涯

完成課程獲得認證

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