# Maximum circular subarray sum of size K

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++

 `// 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

 ``

Output:
```max circular sum = 32
start index = 9
end index = 1```

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

Previous
Next