C++程式中重複連線後建立的陣列中的最大子陣列和


在這個問題中,我們得到一個大小為n的陣列arr[]和一個整數k。我們的任務是建立一個程式,在重複連線後的陣列中找到最大子陣列和。

問題描述 − 我們將找到從重複連線arr k次的陣列中取出的子陣列的最大和。

示例

讓我們舉個例子來理解這個問題。

輸入

arr[] = {−9, −5, 14, 6} k = 2

輸出

26

解釋

New array after repeating : {−9, −5, 14, 6, −9, −5, 14, 6}
Subarray with maximum sum = {14, 6, −9, −5, 14, 6}
Sum = 26

解決方案方法

一個簡單的解決方案是建立一個新的陣列,該陣列在將arr[]連線k次後形成,然後找到具有最大和的子陣列。為此,最好的方法是使用Kadane演算法。

示例

演示我們解決方案工作的程式:

 線上演示

#include <iostream>
using namespace std;
int calcMaxSubArraySum(int arr[], int n, int k){
   int newArr[2*n];
   for(int i = 0; i < k*n; i++)
   newArr[i] = arr[i%n];
   int maxSum = −1000, sum = 0;
   for (int i = 0; i < k*n; i++) {
      sum = sum + newArr[i];
      if (maxSum < sum)
         maxSum = sum;
      if (sum < 0)
         sum = 0;
   }
   return maxSum;
}
int main(){
   int arr[] = { −9, −5, 14, 6 };
   int k = 2;
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum subarray sum in an array created after repeated concatenation is "<<calcMaxSubArraySum(arr, n, k);
   return 0;
}

輸出

The maximum subarray sum in an array created after repeated
concatenation is 26

這種方法很好,但可以使用更有效的模算術方法來解決問題。

模算術是指我們使用模運算子來獲取方程的餘數。

為了解決這個問題,我們將使用模算術而不是透過重複連線來建立陣列。其餘解決方案保持不變。

示例

演示我們解決方案工作的程式:

 線上演示

#include <iostream>
using namespace std;
int calcMaxSubArraySum(int arr[], int n, int k){
   int maxSum = −1000, sum = 0;
   for (int i = 0; i < k*n; i++) {
      sum = sum + arr[i%n];
      if (maxSum < sum)
         maxSum = sum;
      if (sum < 0)
         sum = 0;
   }
   return maxSum;
}
int main(){
   int arr[] = { −9, −5, 14, 6 };
   int k = 2;
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum subarray sum in an array created after
   repeated concatenation is "<<calcMaxSubArraySum(arr, n, k);
   return 0;
}

輸出

The maximum subarray sum in an array created after repeated
concatenation is 26

更新於:2020年12月9日

144 次瀏覽

啟動您的職業生涯

完成課程獲得認證

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