【LeetCode】53. 最大子数组和

122 阅读2分钟

image.png

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 本题给出一组整数组成的数组
    • 要求求出一组具有最大和连续数组
    • 子数组至少包含一个元素

二、思路分析:

我们拿到该题,脑袋里面想到的就遍历列表元素,分别以每个元素为开始进行组合并相加,然后再从中去取出最大值。

假设我们以示列:nums = [-2,1,-3,4,-1,2,1,-5,4]为代表,进行演算。如果按照常规想法去遍历,则遍历完成则需要len(nums)!=9!=45种。例如我们以-2开始组合子数组有9种。

image.png

这样去计算的话,我们无法满足题目要求的O(n)时间复杂度。

例如,我们按照上述想法实现,需要两个for循环,代码如下:

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        Ans = []
        for x in range(len(nums)):
            S = 0
            res = nums[x]
            for y in range(x,len(nums)):
                S = S+nums[y]
                res = max(res,S)
            Ans.append(res)
        return max(Ans)

当数据量较大时,我们以上代码执行时间就会超时。

image.png

这时候,我们需要另辟蹊径,思考更加高效的方法。

我们需要对列表中求出最大和,拆分出步骤主要有两步:

  • 两个元素进行相加
  • 与前面的值进行比较大小,取最大值

换算成公式:dp[i]=max{nums[i],dp[i−1]+nums[i]}

image.png

image.png

image.png

image.png

实现以上逻辑,代码如下:

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        pre = 0
        Ans = nums[0]

        for i in range(len(nums)):

            pre = max(nums[i],pre+nums[i])
            Ans = max(Ans,pre)
        
        return Ans

三、总结:

我们提交代码,通过记录如下:

image.png

本题使用简单的动态规划,时间复杂度为O(n),空间复杂度O(1)

关于动态规划的,后续还要继续学习,把一个问题拆分一个简单的问题还是不那么容易的。

以上是本期内容,欢迎大佬们点赞评论,下期见~~~