Maximum circular subarray sum of size K

03 Jun, 2021
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:  
Iterate the loop till (n + k) times and
Take (i % n) to handle the case when the array index becomes greater than n.
Below is the implementation of above approach:  
C++
Java
Python3
C#
Javascript
// C++ program to find maximum circular// subarray sum of size k #include <bits/stdc++.h>using namespace std; // Function to calculate// maximum sumvoid 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 Codeint 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 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 program to find maximum circular# subarray sum of size k # Function to calculate# maximum sumdef 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 Codeif __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# program to find maximum circular// subarray sum of size kusing 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
<script> // Javascript program to find maximum circular// subarray sum of size k // Function to calculate// maximum sumfunction maxCircularSum(arr, n, k){         // k must be greater    if (n < k)    {        document.write("Invalid");        return;    }     let sum = 0, start = 0, end = k - 1;     // Calculate the sum of first k elements.    for(let i = 0; i < k; i++)    {        sum += arr[i];    }     let ans = sum;     for(let 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;        }    }     document.write("max circular sum = " +                   ans + "<br>");    document.write("start index = " + start +                   "<br>end index = " + end +                   "<br>");} // Driver Codelet arr = [ 18, 4, 3, 4, 5,            6, 7, 8, 2, 10 ];let n = arr.lengthlet k = 3; maxCircularSum(arr, n, k); // This code is contributed by _saurabh_jaiswal </script>
max circular sum = 32
start index = 9
end index = 1
 
Time Complexity: 
ankthon
sanjeev2552
29AjayKumar
_saurabh_jaiswal
circular-array
subarray
subarray-sum
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Data Structures
Search, insert and delete in an unsorted array
Window Sliding Technique
Chocolate Distribution Problem
Find duplicates in O(n) time and O(1) extra space | Set 1
Next Greater Element
Move all negative numbers to beginning and positive to end with constant extra space
What is Data Structure: Types, Classifications and Applications
Count pairs with given sum
Find subarray with given sum | Set 1 (Nonnegative Numbers)