给定一个数组和一个数字k,在修改后的数组中找到连续数组的最大和,该数组是通过重复给定数组k次而形成的。
例子 :
Input : arr[] = {-1, 10, 20}, k = 2
Output : 59
After concatenating array twice, we
get {-1, 10, 20, -1, 10, 20} which has
maximum subarray sum as 59.
Input : arr[] = {-1, -2, -3}, k = 3
Output : -1
一个简单的解决方案是创建一个大小为n * k的数组,然后运行Kadane的算法。时间复杂度为O(nk),辅助空间为O(n * k)
更好的解决方案是在同一数组上运行一个循环,并使用模块化算法从数组末尾开始向后移动。
C++
// C++ program to print largest contiguous
// array sum when array is created after
// concatenating a small array k times.
#include
using namespace std;
// Returns sum of maximum sum subarray created
// after concatenating a[0..n-1] k times.
int maxSubArraySumRepeated(int a[], int n, int k)
{
int max_so_far = INT_MIN, max_ending_here = 0;
for (int i = 0; i < n*k; i++)
{
// This is where it differs from Kadane's
// algorithm. We use modular arithmetic to
// find next element.
max_ending_here = max_ending_here + a[i%n];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
/*Driver program to test maxSubArraySum*/
int main()
{
int a[] = {10, 20, -30, -1};
int n = sizeof(a)/sizeof(a[0]);
int k = 3;
cout << "Maximum contiguous sum is "
<< maxSubArraySumRepeated(a, n, k);
return 0;
}
Java
// Java program to print largest contiguous
// array sum when array is created after
// concatenating a small array k times.
import java.io.*;
class GFG {
// Returns sum of maximum sum
// subarray created after
// concatenating a[0..n-1] k times.
static int maxSubArraySumRepeated(int a[],
int n, int k)
{
int max_so_far = 0;
int INT_MIN, max_ending_here=0;
for (int i = 0; i < n*k; i++)
{
// This is where it differs from
// Kadane's algorithm. We use modular
// arithmetic to find next element.
max_ending_here = max_ending_here +
a[i % n];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
// Driver program to test maxSubArraySum
public static void main (String[] args) {
int a[] = {10, 20, -30, -1};
int n = a.length;
int k = 3;
System.out.println("Maximum contiguous sum is "
+ maxSubArraySumRepeated(a, n, k));
}
}
// This code is contributed by vt_m
Python3
# Python program to print
# largest contiguous
# array sum when array
# is created after
# concatenating a small
# array k times.
# Returns sum of maximum
# sum subarray created
# after concatenating
# a[0..n-1] k times.
def maxSubArraySumRepeated(a, n, k):
max_so_far = -2147483648
max_ending_here = 0
for i in range(n*k):
# This is where it
# differs from Kadane's
# algorithm. We use
# modular arithmetic to
# find next element.
max_ending_here = max_ending_here + a[i%n]
if (max_so_far < max_ending_here):
max_so_far = max_ending_here
if (max_ending_here < 0):
max_ending_here = 0
return max_so_far
# Driver program
# to test maxSubArraySum
a = [10, 20, -30, -1]
n = len(a)
k = 3
print("Maximum contiguous sum is ",
maxSubArraySumRepeated(a, n, k))
# This code is contributed
# by Anant Agarwal.
C#
// C# program to print largest contiguous
// array sum when array is created after
// concatenating a small array k times.
using System;
class GFG {
// Returns sum of maximum sum
// subarray created after
// concatenating a[0..n-1] k times.
static int maxSubArraySumRepeated(int []a,
int n,
int k)
{
int max_so_far = 0;
int max_ending_here=0;
for (int i = 0; i < n * k; i++)
{
// This is where it differs from
// Kadane's algorithm. We use modular
// arithmetic to find next element.
max_ending_here = max_ending_here +
a[i % n];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
// Driver Code
public static void Main ()
{
int []a = {10, 20, -30, -1};
int n = a.Length;
int k = 3;
Console.Write("Maximum contiguous sum is "
+ maxSubArraySumRepeated(a, n, k));
}
}
// This code is contributed by nitin mittal.
PHP
Javascript
输出 :
Maximum contiguous sum is 30
我们可以使用数组的重复属性来获得更好的解决方案吗?