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 = 32Input: 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 <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
<script> // Javascript program to find maximum circular // subarray sum of size k // Function to calculate // maximum sum function 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 Code let arr = [ 18, 4, 3, 4, 5, 6, 7, 8, 2, 10 ]; let n = arr.length let 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:
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!