No53. 最大子序和
题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
- 输入: [-2,1,-3,4,-1,2,1,-5,4]
- 输出: 6
- 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
解题代码(Python3)
尝试1
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
length = len(nums)
matrix = [[float("-inf")]*length for x in range(length)]
#对角线赋值
for i,x in enumerate(nums):
matrix[i][i] = x
for col in range(1,length):
for index in range(col-1,-1,-1):
matrix[index][col] = matrix[index+1][col] + matrix[index][index]
print(matrix)
return max([max(x) for x in matrix])
思路:
利用二维矩阵存储连续元素和,然后通过max函数返回整体最大值
复杂度分析:
- 时间复杂度O(n^2)
- 空间复杂度O(n^2)
运行结果:
尝试2
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
length = len(nums)
for i in range(1,length):
nums[i] = nums[i-1] + nums[i] if nums[i-1] > 0 else nums[i]
return max(nums)
思路:
从第二个元素开始,若前一个元素的值大于0,则进行叠加,利用了传递性。
复杂度分析:
- 时间复杂度O(n)
- 空间复杂度O(1)
运行结果:
尝试3
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
length = len(nums)
maxV = last = nums[0]
for i in range(1,length):
cur = max(nums[i] + last,nums[i])
maxV = cur if cur > maxV else maxV
last = cur
return maxV
思路:
- 用maxV和last记录最大值和之前的和
- 循环到一个元素时,先判断last是否为负,若为负则舍去之前的元素,只保留当前元素,注意此时改元素也可能为负
- 比较maxV和当前和的大小,并进行更新
- 将last设置为当前和,用于下轮驯循环
复杂度分析:
- 时间复杂度O(n)
- 空间复杂度O(1)