C++ Program for Maximum circular subarray sum
Last Updated :
18 Aug, 2023
Given n numbers (both +ve and -ve), arranged in a circle, find the maximum sum of consecutive numbers.
Examples:
Input: a[] = {8, -8, 9, -9, 10, -11, 12}
Output: 22 (12 + 8 - 8 + 9 - 9 + 10)
Input: a[] = {10, -3, -4, 7, 6, 5, -4, -1}
Output: 23 (7 + 6 + 5 - 4 -1 + 10)
Input: a[] = {-1, 40, -14, 7, 6, 5, -4, -1}
Output: 52 (7 + 6 + 5 - 4 - 1 - 1 + 40)
Method 1 There can be two cases for the maximum sum:
- Case 1: The elements that contribute to the maximum sum are arranged such that no wrapping is there. Examples: {-10, 2, -1, 5}, {-2, 4, -1, 4, -1}. In this case, Kadane's algorithm will produce the result.
- Case 2: The elements which contribute to the maximum sum are arranged such that wrapping is there. Examples: {10, -12, 11}, {12, -5, 4, -8, 11}. In this case, we change wrapping to non-wrapping. Let us see how. Wrapping of contributing elements implies non-wrapping of non-contributing elements, so find out the sum of non-contributing elements and subtract this sum from the total sum. To find out the sum of non-contributions, invert the sign of each element and then run Kadane's algorithm.
Our array is like a ring and we have to eliminate the maximum continuous negative that implies maximum continuous positive in the inverted arrays. Finally, we compare the sum obtained in both cases and return the maximum of the two sums.
The following are implementations of the above method.
C++
// C++ program for maximum contiguous circular sum problem
#include <bits/stdc++.h>
using namespace std;
// Standard Kadane's algorithm to
// find maximum subarray sum
int kadane(int a[], int n);
// The function returns maximum
// circular contiguous sum in a[]
int maxCircularSum(int a[], int n)
{
// Case 1: get the maximum sum using standard kadane'
// s algorithm
int max_kadane = kadane(a, n);
// if maximum sum using standard kadane' is less than 0
if(max_kadane < 0)
return max_kadane;
// Case 2: Now find the maximum sum that includes
// corner elements.
int max_wrap = 0, i;
for (i = 0; i < n; i++) {
max_wrap += a[i]; // Calculate array-sum
a[i] = -a[i]; // invert the array (change sign)
}
// max sum with corner elements will be:
// array-sum - (-max subarray sum of inverted array)
max_wrap = max_wrap + kadane(a, n);
// The maximum circular sum will be maximum of two sums
return (max_wrap > max_kadane) ? max_wrap : max_kadane;
}
// Standard Kadane's algorithm to find maximum subarray sum
// See https:// www.geeksforgeeks.org/archives/576 for details
int kadane(int a[], int n)
{
int max_so_far = 0, max_ending_here = 0;
int i;
for (i = 0; i < n; i++) {
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
/* Driver program to test maxCircularSum() */
int main()
{
int a[] = { 11, 10, -20, 5, -3, -5, 8, -13, 10 };
int n = sizeof(a) / sizeof(a[0]);
cout << "Maximum circular sum is " << maxCircularSum(a, n) << endl;
return 0;
}
// This is code is contributed by rathbhupendra
Output:
Maximum circular sum is 31
Complexity Analysis:
- Time Complexity: O(n), where n is the number of elements in the input array.
As only linear traversal of the array is needed. - Auxiliary Space: O(1).
As no extra space is required.
Note that the above algorithm doesn't work if all numbers are negative, e.g., {-1, -2, -3}. It returns 0 in this case. This case can be handled by adding a pre-check to see if all the numbers are negative before running the above algorithm.
Method 2
Approach: In this method, modify Kadane's algorithm to find a minimum contiguous subarray sum and the maximum contiguous subarray sum, then check for the maximum value between the max_value and the value left after subtracting min_value from the total sum.
Algorithm
- We will calculate the total sum of the given array.
- We will declare the variable curr_max, max_so_far, curr_min, min_so_far as the first value of the array.
- Now we will use Kadane's Algorithm to find the maximum subarray sum and minimum subarray sum.
- Check for all the values in the array:-
- If min_so_far is equaled to sum, i.e. all values are negative, then we return max_so_far.
- Else, we will calculate the maximum value of max_so_far and (sum - min_so_far) and return it.
The implementation of the above method is given below.
C++
// C++ program for maximum contiguous circular sum problem
#include <bits/stdc++.h>
using namespace std;
// The function returns maximum
// circular contiguous sum in a[]
int maxCircularSum(int a[], int n)
{
// Corner Case
if (n == 1)
return a[0];
// Initialize sum variable which store total sum of the array.
int sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
}
// Initialize every variable with first value of array.
int curr_max = a[0], max_so_far = a[0], curr_min = a[0], min_so_far = a[0];
// Concept of Kadane's Algorithm
for (int i = 1; i < n; i++) {
// Kadane's Algorithm to find Maximum subarray sum.
curr_max = max(curr_max + a[i], a[i]);
max_so_far = max(max_so_far, curr_max);
// Kadane's Algorithm to find Minimum subarray sum.
curr_min = min(curr_min + a[i], a[i]);
min_so_far = min(min_so_far, curr_min);
}
if (min_so_far == sum)
return max_so_far;
// returning the maximum value
return max(max_so_far, sum - min_so_far);
}
/* Driver program to test maxCircularSum() */
int main()
{
int a[] = { 11, 10, -20, 5, -3, -5, 8, -13, 10 };
int n = sizeof(a) / sizeof(a[0]);
cout << "Maximum circular sum is " << maxCircularSum(a, n) << endl;
return 0;
}
Output:
Maximum circular sum is 31
Complexity Analysis:
- Time Complexity: O(n), where n is the number of elements in the input array.
As only linear traversal of the array is needed. - Auxiliary Space: O(1).
As no extra space is required.
Please refer complete article on
Maximum circular subarray sum for more details!
Similar Reads
C++ Program for Size of The Subarray With Maximum Sum
An array is given, find length of the subarray having maximum sum. Examples : Input : a[] = {1, -2, 1, 1, -2, 1} Output : Length of the subarray is 2 Explanation: Subarray with consecutive elements and maximum sum will be {1, 1}. So length is 2 Input : ar[] = { -2, -3, 4, -1, -2, 1, 5, -3 } Output :
4 min read
C++ Program for Maximum equilibrium sum in an array
Given an array arr[]. Find the maximum value of prefix sum which is also suffix sum for index i in arr[]. Examples : Input : arr[] = {-1, 2, 3, 0, 3, 2, -1} Output : 4 Prefix sum of arr[0..3] = Suffix sum of arr[3..6] Input : arr[] = {-2, 5, 3, 1, 2, 6, -4, 2} Output : 7 Prefix sum of arr[0..3] = Su
4 min read
C++ Program to Find the K-th Largest Sum Contiguous Subarray
Given an array of integers. Write a program to find the K-th largest sum of contiguous subarray within the array of numbers which has negative and positive numbers. Examples:Â Input: a[] = {20, -5, -1} k = 3 Output: 14 Explanation: All sum of contiguous subarrays are (20, 15, 14, -5, -6, -1) so the
3 min read
Maximum Sum SubArray using Divide and Conquer | Set 2
Given an array arr[] of integers, the task is to find the maximum sum sub-array among all the possible sub-arrays.Examples: Input: arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4} Output: 6 {4, -1, 2, 1} is the required sub-array.Input: arr[] = {2, 2, -2} Output: 4 Approach: Till now we are only aware of Kad
13 min read
C++ Program for Number of pairs with maximum sum
Given an array arr[], count number of pairs arr[i], arr[j] such that arr[i] + arr[j] is maximum and i Example : Input : arr[] = {1, 1, 1, 2, 2, 2} Output : 3 Explanation: The maximum possible pair sum where i Method 1 (Naive)Â Traverse a loop i from 0 to n, i.e length of the array and another loop j
3 min read
Sum of Max of Subarrays
Given an array arr[], the task is to find the sum of the maximum elements of every possible non-empty sub-arrays of the given array arr[].Examples: Input: arr[] = [1, 3, 2]Output: 15Explanation: All possible non-empty subarrays of [1, 3, 2] are {1}, {3}, {2}, {1, 3}, {3, 2} and {1, 3, 2}. The maximu
12 min read
C++ Program for Queries to find maximum sum contiguous subarrays of given length in a rotating array
Given an array arr[] of N integers and Q queries of the form {X, Y} of the following two types: If X = 1, rotate the given array to the left by Y positions.If X = 2, print the maximum sum subarray of length Y in the current state of the array. Examples:Â Input: N = 5, arr[] = {1, 2, 3, 4, 5}, Q = 2,
5 min read
Maximum length of subarray such that sum of the subarray is even
Given an array of N elements. The task is to find the length of the longest subarray such that sum of the subarray is even.Examples: Input : N = 6, arr[] = {1, 2, 3, 2, 1, 4}Output : 5Explanation: In the example the subarray in range [2, 6] has sum 12 which is even, so the length is 5.Input : N = 4,
11 min read
C++ Program to Maximum sum of i*arr[i] among all rotations of a given array
Given an array arr[] of n integers, find the maximum that maximizes the sum of the value of i*arr[i] where i varies from 0 to n-1. Examples: Input: arr[] = {8, 3, 1, 2} Output: 29 Explanation: Lets look at all the rotations, {8, 3, 1, 2} = 8*0 + 3*1 + 1*2 + 2*3 = 11 {3, 1, 2, 8} = 3*0 + 1*1 + 2*2 +
6 min read
C++ Program to Find maximum value of Sum( i*arr[i]) with only rotations on given array allowed
Given an array, only rotation operation is allowed on array. We can rotate the array as many times as we want. Return the maximum possible summation of i*arr[i]. Examples :Â Â Input: arr[] = {1, 20, 2, 10} Output: 72 We can get 72 by rotating array twice. {2, 10, 1, 20} 20*3 + 1*2 + 10*1 + 2*0 = 72 I
4 min read