大小为 K 的最大圆形子数组和
给定一个大小为N的数组arr和一个整数K ,任务是在所有连续子数组中找到大小为k的最大和子数组(也考虑循环子数组)。
例子:
Input: arr = {18, 4, 3, 4, 5, 6, 7, 8, 2, 10}, k = 3
Output:
max circular sum = 32
start index = 9
end index = 1
Explanation:
Maximum Sum = 10 + 18 + 4 = 32
Input: arr = {8, 2, 5, 9}, k = 4
Output:
max circular sum = 24
start index = 0
end index = 3
方法:
- 迭代循环直到 (n + k) 次并且
- 取(i % n) 处理数组索引大于n的情况。
以下是上述方法的实现:
C++
// C++ program to find maximum circular
// subarray sum of size k
#include
using namespace std;
// Function to calculate
// maximum sum
void maxCircularSum(int arr[], int n, int k)
{
// k must be greater
if (n < k) {
cout << "Invalid";
return;
}
int sum = 0, start = 0, end = k - 1;
// calculate the sum of first k elements.
for (int i = 0; i < k; i++) {
sum += arr[i];
}
int ans = sum;
for (int i = k; i < n + k; i++) {
// add current element to sum
// and subtract the first element
// of the previous window.
sum += arr[i % n] - arr[(i - k) % n];
if (sum > ans) {
ans = sum;
start = (i - k + 1) % n;
end = i % n;
}
}
cout << "max circular sum = "
<< ans << endl;
cout << "start index = " << start
<< "\nend index = " << end << endl;
}
// Driver Code
int main()
{
int arr[] = { 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
maxCircularSum(arr, n, k);
return 0;
}
Java
// Java program to find maximum circular
// subarray sum of size k
import java.util.*;
class GFG
{
// Function to calculate
// maximum sum
static void maxCircularSum(int[] arr, int n, int k)
{
// k must be greater
if (n < k)
{
System.out.println("Invalid");
return;
}
int sum = 0, start = 0, end = k - 1;
// calculate the sum of first k elements.
for (int i = 0; i < k; i++)
sum += arr[i];
int ans = sum;
for (int i = k; i < n + k; i++)
{
// add current element to sum
// and subtract the first element
// of the previous window.
sum += arr[i % n] - arr[(i - k) % n];
if (sum > ans)
{
ans = sum;
start = (i - k + 1) % n;
end = i % n;
}
}
System.out.println("max circular sum = " + ans);
System.out.println("start index = " + start + "\nend index = " + end);
}
// Driver Code
public static void main(String[] args)
{
int[] arr = { 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 };
int n = arr.length;
int k = 3;
maxCircularSum(arr, n, k);
}
}
// This code is contributed by
// sanjeev2552
Python3
# Python3 program to find maximum circular
# subarray sum of size k
# Function to calculate
# maximum sum
def maxCircularSum(arr, n, k) :
# k must be greater
if (n < k) :
print("Invalid");
return;
sum = 0; start = 0; end = k - 1;
# calculate the sum of first k elements.
for i in range(k) :
sum += arr[i];
ans = sum;
for i in range(k, n + k) :
# add current element to sum
# and subtract the first element
# of the previous window.
sum += arr[i % n] - arr[(i - k) % n];
if (sum > ans) :
ans = sum;
start = (i - k + 1) % n;
end = i % n;
print("max circular sum = ",ans);
print("start index = ", start,
"\nend index = ", end);
# Driver Code
if __name__ == "__main__" :
arr = [ 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 ];
n = len(arr);
k = 3;
maxCircularSum(arr, n, k);
# This code is contributed by AnkitRai01
C#
// C# program to find maximum circular
// subarray sum of size k
using System;
class GFG
{
// Function to calculate
// maximum sum
static void maxCircularSum(int[] arr,
int n, int k)
{
// k must be greater
if (n < k)
{
Console.WriteLine("Invalid");
return;
}
int sum = 0, start = 0, end = k - 1;
// calculate the sum of first k elements.
for (int i = 0; i < k; i++)
sum += arr[i];
int ans = sum;
for (int i = k; i < n + k; i++)
{
// add current element to sum
// and subtract the first element
// of the previous window.
sum += arr[i % n] - arr[(i - k) % n];
if (sum > ans)
{
ans = sum;
start = (i - k + 1) % n;
end = i % n;
}
}
Console.WriteLine("max circular sum = " + ans);
Console.WriteLine("start index = " + start +
"\nend index = " + end);
}
// Driver Code
public static void Main(String[] args)
{
int[] arr = { 18, 4, 3, 4, 5,
6, 7, 8, 2, 10 };
int n = arr.Length;
int k = 3;
maxCircularSum(arr, n, k);
}
}
// This code is contributed by 29AjayKumar
Javascript
输出:
max circular sum = 32
start index = 9
end index = 1
时间复杂度: