/** * @param {number[]} nums * @return {number} */ const maxSubarraySumCircular = function (nums) { }; /* 最大子数组之和无外乎两种情况,子数组在开头和结尾直接,还有一种情况就是一部分在开头的前缀,一部分在结尾的后缀, 所以只需一次遍历统计前缀和的最大值和第一种情况的最大值,之后再倒序遍历统计后缀的最大值,之后比较这两种情况 */ function f1(nums) { const n = nums.length; const leftMax = new Array(n).fill(0); // 对坐标为 0 处的元素单独处理,避免考虑子数组为空的情况 leftMax[0] = nums[0]; let leftSum = nums[0]; let pre = nums[0]; let res = nums[0]; for (let i = 1; i < n; i++) { pre = Math.max(pre + nums[i], nums[i]); res = Math.max(res, pre); leftSum += nums[i]; leftMax[i] = Math.max(leftMax[i - 1], leftSum); } // 从右到左枚举后缀,固定后缀,选择最大前缀 let rightSum = 0; for (let i = n - 1; i > 0; i--) { rightSum += nums[i]; res = Math.max(res, rightSum + leftMax[i - 1]); } return res; }