53. 最大子数组和
给你一个整数数组 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 <= 10(5)
-10(4) <= nums[i] <= 10(4)
**进阶:**如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
动态规划,dp[i]表示以第i个元素结尾的子数组的最大和
则dp[i+1] = max(nums[i], dp[i]+nums[i])
1 | class Solution { |
采用分治法
定义一个操作 get(a, l, r) 表示查询 a 序列 [l,r] 区间内的最大子段和
那么最终我们要求的答案就是 get(nums, 0, nums.size() - 1)
我们将区间分为两段,当元素只剩一个时开始合并
合并两个区间时想要在o(1)时间求得新区间的ans,我们可以维护四个变量
lAns 表示 [l,r] 内以 l 为左端点的最大子段和
rAns 表示 [l,r] 内以 r 为右端点的最大子段和
ans 表示 [l,r] 内的最大子段和
sum 表示 [l,r] 的区间和
首先sum直接加即可;
lAns有两种情况:(rAns同理)
左区间的lAns;
左区间的sum+右区间的lAns
最后ans就可以通过l.ans、r.ans、l.rAns+r.lAns求得
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.




