53. 最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
class Solution:def maxSubArray(self, nums: List[int]) -> int:ans = nums[0]tmp = nums[0]for i in range(1,len(nums),1):tmp = max(tmp+nums[i], nums[i])ans = max(ans, tmp)return ans
53. 最大子数组和
两个不重合的连续子数组最大和
在上题基础上,求解数组的两个不重合的连续子数组和的最大值。
解题思路:
最开始的思路,就是将数组分为两部分,分别求最大连续子数组和然后相加,时间复杂度为O(n^2)。
进一步优化:
1.构建两个dp数组,分别表示从左到右,从右到左的连续子数组和的最大值。
2.遍历不同的划分点,计算最大值。
与上述类似思路的题目 135. 分发糖果
def maxtwo(nums):n = len(nums)def leftmax(l):dp = [0]*nt = 0ans = float('-inf')for i in range(n):t = max(l[i], l[i]+t)ans = max(t, ans)dp[i] = ansreturn dpdef rightmax(l):dp = [0]*nt = 0ans = float('-inf')for i in range(n-1,-1,-1):t = max(l[i], t+l[i])ans = max(t, ans)dp[i] = ansreturn dpleft = leftmax(nums)right = rightmax(nums)ans = float('-inf')for i in range(n-1):ans = max(ans, left[i] + right[i+1])return ans