Maximum circular subarray sum of size K (original) (raw)

Last Updated : 23 Dec, 2022

Given an array arr of size N and an integer K, the task is to find the maximum sum subarray of size k among all contiguous sub-array (considering circular subarray also).

Examples:

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

Approach:

Below is the implementation of above approach:

C++ `

// C++ program to find maximum circular // subarray sum of size k

#include <bits/stdc++.h> 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

`

Output:

max circular sum = 32 start index = 9 end index = 1

**Time Complexity:**O(N)
Auxiliary Space: O(1), no extra space is required, so it is a constant.

Similar Reads