LeetCode 刷题之旅(2020.05.03)

LeetCode 刷题之旅(2020.05.03)——53. 最大子序和(简)

题目:

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

解题模板:
Python 3:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:

解题思路:

  • 状态转移:
    计算每个以位置 i 为结尾的子数列的元素和 f ( i ) ,最终结果为 max ( f ( i ) )
    计算 f ( i ) 的方法:f ( i ) = max ( f ( i - 1) , f ( i - 1) + nums [ i ] )

  • 分治算法:
    三种情况:
    1、最大子数列在左;
    2、最大子数列在右;
    3、最大组数列在中。

解法:

  1. 状态转移:
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_value = nums[0]
        for i in range(1, len(nums)):
            if nums[i] + nums[i-1] > nums[i]:
                nums[i] += nums[i-1]
            if nums[i] > max_value:
                max_value = nums[i]
        return max_value

时间复杂度O(N)
空间复杂度O(1)

  1. 分治算法:
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]
        else:
            max_left = self.maxSubArray(nums[0:len(nums)//2])
            max_right = self.maxSubArray(nums[len(nums)//2:len(nums)])
        # 从中间向两边求和
        max_1 = nums[len(nums) // 2 - 1]
        tmp = 0
        for i in range(len(nums) // 2 - 1, -1, -1):
            tmp += nums[i]
            max_1 = max(tmp, max_1)
        max_2 = nums[len(nums) // 2]
        tmp = 0
        for i in range(len(nums) // 2, len(nums)):
            tmp += nums[i]
            max_2 = max(tmp, max_2)
        return max(max_1+max_2, max_left, max_right)

时间复杂度O(N * log N)
空间复杂度O(1)

你可能感兴趣的:(LeetCode每日一题)