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