Advertisement
lifeiteng

918. Maximum Sum Circular Subarray

Oct 6th, 2018
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.21 KB | None | 0 0
  1. class Solution {
  2.     public int maxSubarraySumCircular(int[] A) {
  3.         int n = A.length, maxi = Integer.MIN_VALUE;
  4.         int[] copy = new int[n * 2], sum = new int[n * 2 + 1];
  5.         boolean f = false;
  6.         for(int i = 0; i < n; i++)
  7.         {
  8.             copy[i] = A[i];
  9.             maxi = Math.max(maxi, A[i]);    // least single element
  10.             if(A[i] >= 0) f = true;
  11.         }
  12.         if(!f) return maxi;
  13.         for(int i = n; i < n * 2; i++) copy[i] = A[i % n];
  14.         for(int i = 0; i < n * 2; i++)
  15.         {
  16.             sum[i + 1] = sum[i] + copy[i];
  17.         }
  18.         TreeMap<Integer, Integer> map = new TreeMap<>();
  19.         for(int i = 0; i < n; i++)
  20.             map.put(sum[i], map.getOrDefault(sum[i], 0) + 1);
  21.         int[] mini = new int[n * 2 + 1];
  22.         mini[n] = map.firstKey();
  23.         for(int i = n; i < 2 * n; i++)
  24.         {
  25.             int first = sum[i - n], last = sum[i];
  26.             map.put(first, map.get(first) - 1);
  27.             if(map.get(first) == 0) map.remove(first);
  28.             map.put(last, map.getOrDefault(last, 0) + 1);
  29.             mini[i + 1] = map.firstKey();
  30.         }
  31.         for(int i = n - 1; i < n * 2; i++)
  32.         {
  33.             maxi = Math.max(maxi, sum[i] - mini[i]);
  34.         }
  35.         // System.out.println(Arrays.toString(copy));
  36.         // System.out.println(Arrays.toString(sum));
  37.         // System.out.println(Arrays.toString(mini));
  38.         return maxi;    
  39.     }
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement