Leetcode Maximum Subarray python 学习动态规划

Leetcode 53题
Maximum Subarray
Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.

Example:

Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.

题目大意:给一个数列,从所有的子数列中找到和最大的子数列。


动态规划:
其实就是标准的动态规划问题:
随着遍历这个数组,在到每一个位置的时候,弄一个局部最大L值,代表以当前位置为结尾的最大子串,比如说我遍历到第i个,那么以第i个为结尾的最大子串就是我们要求的L。

比如这个题目:
-2 , 1, −3,4,−1,2,1,−5,4
位置0,L=x=-2,没得选
位置1,要以x=1为结尾的最大的,那肯定不要带上之前的-2,只要1就好L=x=1
位置2,因为本身x=-3,加上上一个位置L 是正数1,所以L=L+x=-3+1=-2。
下面以此类推得到:

对应的L应该是:
-2, 1, -2,4,3,5,6,-1,3

而全局最大值G就是我们最终想要的结果,
肯定这个全局最大值出自局部最大值。
(因为全局最大的那个子串的结尾肯定在数组里,言外之意就是不管怎么样这个G都肯定出自L)

最后找到最大的那个L就是我们想要的G了。
不过这个边界的对比组用float(’-inf’)表示无穷小。

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        l = g = float('-inf') #表示等于负无穷。
        for n in nums:
            l = max(n,l+n)
            g = max(l,g)
        return g  #动态规划

改进:
数学模型:
dp[i]=dp[i−1]+s[i] , dp[i−1]≥0
dp[i]=s[i] ,dp[i−1]<0
​意思就是当前一项大于等于0时,动态规划的结果,就是前一项加当前项。当前一项小于0时,动态规划的结果就是当前项。

所以改进后的代码为:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        pd = [0 for i in range(len(nums))] #从0开始
        pd[0] = nums[0] #先给动态规划赋值
        max_num = pd[0] #用指针指向动态规划来代替动态规划操作。
        for i in range(1,len(pd)):
            pd[i] = pd[i-1] * (pd[i-1] > 0) + nums[i] 
            #前一项大于0时为真,返回1,存在。
            max_num = max(max_num, pd[i])
        return max_num

发布了20 篇原创文章 · 获赞 1 · 访问量 807

猜你喜欢

转载自blog.csdn.net/weixin_43860294/article/details/104726705