Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution {
- public int maxSubarraySumCircular(int[] A) {
- int n = A.length, maxi = Integer.MIN_VALUE;
- int[] copy = new int[n * 2], sum = new int[n * 2 + 1];
- boolean f = false;
- for(int i = 0; i < n; i++)
- {
- copy[i] = A[i];
- maxi = Math.max(maxi, A[i]); // least single element
- if(A[i] >= 0) f = true;
- }
- if(!f) return maxi;
- for(int i = n; i < n * 2; i++) copy[i] = A[i % n];
- for(int i = 0; i < n * 2; i++)
- {
- sum[i + 1] = sum[i] + copy[i];
- }
- TreeMap<Integer, Integer> map = new TreeMap<>();
- for(int i = 0; i < n; i++)
- map.put(sum[i], map.getOrDefault(sum[i], 0) + 1);
- int[] mini = new int[n * 2 + 1];
- mini[n] = map.firstKey();
- for(int i = n; i < 2 * n; i++)
- {
- int first = sum[i - n], last = sum[i];
- map.put(first, map.get(first) - 1);
- if(map.get(first) == 0) map.remove(first);
- map.put(last, map.getOrDefault(last, 0) + 1);
- mini[i + 1] = map.firstKey();
- }
- for(int i = n - 1; i < n * 2; i++)
- {
- maxi = Math.max(maxi, sum[i] - mini[i]);
- }
- // System.out.println(Arrays.toString(copy));
- // System.out.println(Arrays.toString(sum));
- // System.out.println(Arrays.toString(mini));
- return maxi;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement