上海网站设计方法,网页设计素材参考,站内优化,企业网站建设多少家题目描述
给你一个整数数组 nums #xff0c;请你找出一个具有最大和的连续子数组#xff08;子数组最少包含一个元素#xff09;#xff0c;返回其最大和。
子数组是数组中的一个连续部分。
分治解法
这个问题可以分成从左半边数组找最大子段和从右半部分找最大子段和…题目描述
给你一个整数数组 nums 请你找出一个具有最大和的连续子数组子数组最少包含一个元素返回其最大和。
子数组是数组中的一个连续部分。
分治解法
这个问题可以分成从左半边数组找最大子段和从右半部分找最大子段和。 对于跨越两个数组的情况我们可以从中间一定要包含左边界的数字或者右边界的数字只需要一次遍历就可以了。
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);}
}