Maximum circular subarray sum | GeeksforGeeks


Maximum circular subarray sum | GeeksforGeeks
Given n numbers (both +ve and -ve), arranged in a circle, fnd the maximum sum of consecutive number.


Case 1: The elements that contribute to the maximum sum are arranged such that no wrapping is there.  Kadane’s algorithm will produce the result.
Case 2: The elements which contribute to the maximum sum are arranged such that wrapping is there. 

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 contributing, invert 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 by both cases, and return the maximum of the two sums.
int maxCircularSum (int a[], int n)
{
   // Case 1: get the maximum sum using standard kadane's algorithm
   int max_kadane = kadane(a, n);
   // 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
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_ending_here < 0)
            max_ending_here = 0;
        if(max_so_far < max_ending_here)
            max_so_far = max_ending_here;
    }
    return max_so_far;
}

-- Same technique can be use to get min subarray sum.
First pass: find max subarray sum. 
Second pass: find min subarray sum, and subtract it from total sum.
public int maxConsSum2(int[] arr) {
    if (arr == null || arr.length == 0) {
        return 0;
    }
    int soFar = 0;
    int max = 0;
    int totalSum = 0;
    for (Integer i: arr) {
        totalSum += i;
        // totalSum is used in next step
        soFar += i;
        soFar = Math.max(soFar, 0);
        max = Math.max(max, soFar);
    }
    int min = 0;
    // calculate the min subarray
    for (Integer i: arr) {
        soFar += i;
        soFar = Math.min(soFar, 0);
        min = Math.min(min, soFar);
    }
    return Math.max(max, totalSum - min);
}

X. EPI Java Solution: Compute the maximum subarray sum in a circular array

MaximumSubarrayInCircularArray.java ???
  public static int maxSubarraySumInCircular(List<Integer> A) {
    return Math.max(findMaxSubarray(A), findCircularMaxSubarray(A));
  }

  // Calculates the non-circular solution.
  private static int findMaxSubarray(List<Integer> A) {
    int maximumTill = 0, maximum = 0;
    for (Integer a : A) {
      maximumTill = Math.max(a, a + maximumTill);
      maximum = Math.max(maximum, maximumTill);
    }
    return maximum;
  }

  // Calculates the solution which is circular.
  private static int findCircularMaxSubarray(List<Integer> A) {
    // Maximum subarray sum starts at index 0 and ends at or before index i.
    ArrayList<Integer> maximumBegin = new ArrayList<>();
    int sum = A.get(0);
    maximumBegin.add(sum);
    for (int i = 1; i < A.size(); ++i) {
      sum += A.get(i);
      maximumBegin
          .add(Math.max(maximumBegin.get(maximumBegin.size() - 1), sum));
    }

    // Maximum subarray sum starts at index i + 1 and ends at the last element.
    Integer[] maximumEnd = new Integer[A.size()];
    maximumEnd[maximumEnd.length - 1] = 0;
    sum = 0;
    for (int i = A.size() - 2; i >= 0; --i) {
      sum += A.get(i + 1);
      maximumEnd[i] = Math.max(maximumEnd[i + 1], sum);
    }

    // Calculates the maximum subarray which is circular.
    int circularMax = 0;
    for (int i = 0; i < A.size(); ++i) {
      circularMax = Math.max(circularMax, maximumBegin.get(i) + maximumEnd[i]);
    }
    return circularMax;
  }
MaximumSubarrayInCircularArrayConstantSpace.java
  private interface IntegerComparator {
    Integer compare(Integer o1, Integer o2);
  }
  private static class MaxComparator implements IntegerComparator {
    public Integer compare(Integer o1, Integer o2) {
      return o1 > o2 ? o1 : o2;
    }
  }

  private static class MinComparator implements IntegerComparator {
    public Integer compare(Integer o1, Integer o2) {
      return o1 > o2 ? o2 : o1;
    }
  }
  public static int maxSubarraySumInCircular(List<Integer> A) {
    // Finds the max in non-circular case and circular case.
    int accumulate = 0;
    for (int a : A) {
      accumulate += a;
    }
    return Math.max(findOptimumSubarrayUsingComp(A, new MaxComparator()),
        accumulate - findOptimumSubarrayUsingComp(A, new MinComparator()));
  }

  private static int findOptimumSubarrayUsingComp(List<Integer> A,
                                                  IntegerComparator comp) {
    int till = 0, overall = 0;
    for (int a : A) {
      till = comp.compare(a, a + till);
      overall = comp.compare(overall, till);
    }
    return overall;
  }

X. One Pass
http://www.cnblogs.com/easonliu/p/3898975.html
Maxsum={ 原问题的最大子数组和;数组所有元素总值-最小子数组和 }
 8 void getRes() {
 9     int max = 0, min = 0, max_tmp = 0, min_tmp = 0, sum = 0;
10     for (int i = 0; i < n; ++i) {
11         sum += a[i];
12         max_tmp += a[i];
13         min_tmp += a[i];
14         if (max_tmp < 0) max_tmp = 0;
15         if (min_tmp > 0) min_tmp = 0;
16         max = max > max_tmp ? max : max_tmp;
17         min = min < min_tmp ? min : min_tmp;
18     }
19  
20     int res =  max > (sum - min) ? max : (sum - min);
21     cout << res << endl;
22 }
http://www.acmerblog.com/max-sum-rectangle-in-a-matrix-5955.html ??
01static int MaxSumLinked(int arr[], int n){
02        int currentSum = arr[0];
03        int ans = currentSum;
04        boolean hasNegative = false;//有可能全部都是非负,这时就没必要往后计算
05        for(int i=1; i<n*2-1; i++){
06            if(i < n && arr[i] < 0) hasNegative = true;
07            currentSum = Math.max(currentSum+arr[i%n], arr[i%n]);
08            ans = Math.max(ans, currentSum);
09            if(i == n-1 && !hasNegative) return ans;
10        }
11        return ans;
12    }
Read full article from Maximum circular subarray sum | GeeksforGeeks

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts