题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
- 1 <= nums.length <= 105
- -104 <= nums[i] <= 104
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
个人解法
Javascript
/** @lc app=leetcode.cn id=53 lang=javascript** [53] 最大子数组和*/// @lc code=start/*** @param {number[]} nums* @return {number}*/var maxSubArray = function (nums) {let max = -200000;let sum = -200000;const length = nums.length;for (let i = 0; i < length; i++) {if (sum + nums[i] > nums[i]) {sum = sum + nums[i];} else {sum = nums[i];}if (sum > max) {max = sum;}}return max;};// @lc code=end
简化
var maxSubArray = function(nums) {let pre = 0, maxAns = nums[0];nums.forEach((x) => {pre = Math.max(pre + x, x);maxAns = Math.max(maxAns, pre);});return maxAns;};
Java
class Solution {public int maxSubArray(int[] nums) {int ans = nums[0];int sum = 0;for(int num: nums) {if(sum > 0) {sum += num;} else {sum = num;}ans = Math.max(ans, sum);}return ans;}}
其他解法
Java
分治法
class Solution {public class Status {public int lSum, rSum, mSum, iSum;public Status(int lSum, int rSum, int mSum, int iSum) {this.lSum = lSum;this.rSum = rSum;this.mSum = mSum;this.iSum = iSum;}}public int maxSubArray(int[] nums) {return getInfo(nums, 0, nums.length - 1).mSum;}public Status getInfo(int[] a, int l, int r) {if (l == r) {return new Status(a[l], a[l], a[l], a[l]);}int m = (l + r) >> 1;Status lSub = getInfo(a, l, m);Status rSub = getInfo(a, m + 1, r);return pushUp(lSub, rSub);}public Status pushUp(Status l, Status r) {int iSum = l.iSum + r.iSum;int lSum = Math.max(l.lSum, l.iSum + r.lSum);int rSum = Math.max(r.rSum, r.iSum + l.rSum);int mSum = Math.max(Math.max(l.mSum, r.mSum), l.rSum + r.lSum);return new Status(lSum, rSum, mSum, iSum);}}
Javascript
分治法
function Status(l, r, m, i) {this.lSum = l;this.rSum = r;this.mSum = m;this.iSum = i;}const pushUp = (l, r) => {const iSum = l.iSum + r.iSum;const lSum = Math.max(l.lSum, l.iSum + r.lSum);const rSum = Math.max(r.rSum, r.iSum + l.rSum);const mSum = Math.max(Math.max(l.mSum, r.mSum), l.rSum + r.lSum);return new Status(lSum, rSum, mSum, iSum);}const getInfo = (a, l, r) => {if (l === r) {return new Status(a[l], a[l], a[l], a[l]);}const m = (l + r) >> 1;const lSub = getInfo(a, l, m);const rSub = getInfo(a, m + 1, r);return pushUp(lSub, rSub);}var maxSubArray = function(nums) {return getInfo(nums, 0, nums.length - 1).mSum;};
