-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsolution.js
More file actions
36 lines (29 loc) · 916 Bytes
/
Copy pathsolution.js
File metadata and controls
36 lines (29 loc) · 916 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
* @param {number[]} arr
* @returns {number}
*/
class Solution {
maxCircularSum(arr) {
if (!arr || arr.length === 0) return 0;
let total = arr[0];
let maxEnding = arr[0],
maxSoFar = arr[0];
let minEnding = arr[0],
minSoFar = arr[0];
for (let i = 1; i < arr.length; ++i) {
let x = arr[i];
// Kadane for max subarray
maxEnding = Math.max(x, maxEnding + x);
if (maxEnding > maxSoFar) maxSoFar = maxEnding;
// Kadane for min subarray
minEnding = Math.min(x, minEnding + x);
if (minEnding < minSoFar) minSoFar = minEnding;
total += x;
}
// If all numbers are negative, maxSoFar will be the largest (negative) element
if (maxSoFar < 0) return maxSoFar;
// wrapping max = total - min subarray
const wrapMax = total - minSoFar;
return Math.max(maxSoFar, wrapMax);
}
}