【Leetcode】53. 最大子序和(Maximum Subarray)

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)

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/113731423