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> |
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.
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!