Open In App

Java Program for Maximum circular subarray sum

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:  

The following are implementations of the above method. 






// Java program for maximum contiguous circular sum problem
import java.io.*;
import java.util.*;
 
class Solution{
    public static int kadane(int a[],int n){
        int res = 0;
        int x =  a[0];
        for(int i = 0; i < n; i++){
            res = Math.max(a[i],res+a[i]);
            x= Math.max(x,res);
        }
        return x;
    }
  //lets write a function for calculating max sum in circular manner as discuss above
    public static int reverseKadane(int a[],int n){
        int total = 0;
      //taking the total sum of the array elements
        for(int i = 0; i< n; i++){
            total +=a[i];
             
        }
      // inverting the array
        for(int i = 0; i<n ; i++){
            a[i] = -a[i];
        }
      // finding min sum subarray
        int k = kadane(a,n);
//      max circular sum
        int ress = total+k;
       // to handle the case in which all elements are negative
        if(total == -k ){
            return total;
        }
        else{
        return ress;
        }
         
    }
 
    public static void main(String[] args)
    {   int a[] = {1,4,6,4,-3,8,-1};
        int n = 7;
        if(n==1){
             System.out.println("Maximum circular sum is " +a[0]);
        }
        else{
        
        System.out.println("Maximum circular sum is " +Integer.max(kadane(a,n), reverseKadane(a,n)));
        }
    }
} /* This code is contributed by Mohit Kumar*/

Output: 

Maximum circular sum is 31

Complexity Analysis:  

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 

  1. We will calculate the total sum of the given array.
  2. We will declare the variable curr_max, max_so_far, curr_min, min_so_far as the first value of the array.
  3. Now we will use Kadane’s Algorithm to find the maximum subarray sum and minimum subarray sum.
  4. Check for all the values in the array:- 
    1. If min_so_far is equaled to sum, i.e. all values are negative, then we return max_so_far.
    2. 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.  

Output: 

Maximum circular sum is 31

Complexity Analysis:  

Please refer complete article on Maximum circular subarray sum for more details!
 


Article Tags :