通过在C ++中重复给定数组k次而形成的数组中的最大子数组总和
在这个问题上,我们得到一个数组和一个数字k。我们的任务是创建一个程序,该程序将在c++中通过重复给定数组k次而在数组中找到最大子数组和。
问题描述-在这里,我们将找到通过重复k次给定数组而形成的数组所形成的子数组的最大和。
让我们举个例子来了解这个问题,
输入-数组={3,5,1}k=2
输出-18
说明-
array formed by repeating k times, array = {3, 5, 1, 3, 5, 1} Maximum subarray sum = 3+5+1+3+5+1 = 18
为了解决这个问题,我们将计算数组所有元素的总和。
然后,基于总和,我们将计算子数组的总和。
如果sum>0,我们将乘以数组k的总和乘以给出的实际总和。
如果sum<0,我们将发现maxSum带有两个重复数组的子数组。
示例
显示我们解决方案实施情况的程序,
#include<iostream> using namespace std; void repeatArray(int *arr, int *b, int k,int len) { int j = 0; while (k > 0){ for (int i = 0; i < len; i++) b[j++] = arr[i]; k--; } } long subArraySum(int *a,int len) { int max = 0; long newmax = 0; for (int i = 0; i < len; i++) { newmax = newmax + a[i]; if (max < newmax) max = newmax; if (newmax < 0) newmax = 0; } return max; } long findMaxSubArraySum(int *arr, int k,int len) { int arraySum = 0; long maxSum = 0; int b[(2 * len)]= {0}; repeatArray(arr, b, 2,len); for (int i = 0; i < len; i++) arraySum += arr[i]; maxSum = subArraySum(b,2*len); if (arraySum > 0) maxSum = subArraySum(b,2*len) + (k - 2) * arraySum; return maxSum; } int main() { int arr[] = { 3, 5, 1}; int length=sizeof(arr)/sizeof(arr[0]); int k = 3; cout<<"The maximum subarray sum in array formed by repeating the given array "<<k<<" times is "<<findMaxSubArraySum(arr, k,length); return 0; }
输出结果
The maximum subarray sum in array formed by repeating the given array 3 times is 27