2
* @param {number[]} nums5
var maxSubarraySumCircular = function (nums) {8
// Kadane for single interval9
let curr = nums[0]; // dp[j] Maximum sum subbarray till j10
let ans = nums[0]; // Maximum of all dps till j i.e. max(dp[0], dp[1], ... dp[i], ...dp[j]);12
for (let i = 1; i < n; i++) {13
curr = nums[i] + Math.max(0, curr);14
ans = Math.max(ans, curr);18
* If we don't find answer using kadane using above logic then that means only one thing19
* some answer is present in 1st half and second in other half (since it is circular array)22
let rightSum = new Array(n); // Sum from Right, used to represent 2nd half of the solution24
rightSum[n - 1] = nums[n - 1];26
for (let i = n - 2; i >= 0; i--) {27
rightSum[i] = rightSum[i + 1] + nums[i];30
let maxRightSum = new Array(n); // Used to fast fetch max right sum till given point31
maxRightSum[n - 1] = rightSum[n - 1];33
for (let i = n - 2; i >= 0; i--) {34
maxRightSum[i] = Math.max(maxRightSum[i + 1], rightSum[i]);38
* Now solution is max of:39
* [Sum of [A0 --- Ai] + Maximum [Ai+2 --- An]]40
* Considering i + 1 will be equivalent to kadane which we already discussed above.43
for (let i = 0; i < n - 2; i++) {45
ans = Math.max(ans, leftSum + maxRightSum[i + 2]);