📜  重复级联后创建的数组中的最大子数组总和

📅  最后修改于: 2021-05-06 18:21:31             🧑  作者: Mango

给定一个数组和一个数字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

我们可以使用数组的重复属性来获得更好的解决方案吗?