一.53 最大子数组和
1.题目
2.视频题解
【看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和-哔哩哔哩】 https://b23.tv/V8C4um9
DP的思路
五部曲:dp含义,递推公式,初始化,遍历顺序,打印
dp含义:令dp[i]=以第i个下表为结尾的最大子序和
递推公式:dp[i]=max(dp[i-1]+nums[i],nums[i])
要么要链接上前面一坨,要不从num[i]开始从新开始
初始化:dp[0]=nums[0]
遍历顺序:根据递推公式能够看出是从前往后遍历
for i in range(1, len(nums)):一边遍历,得到dp[i],一边记录最大的子序,这样可以节省一次遍历,找dp[i]的最大值
3.代码
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
f = [0] * len(nums)
f[0] = nums[0]
result=f[0]
for i in range(1, len(nums)):
f[i] = max(f[i - 1]+nums[i],nums[i])
if result<f[i]:
result=f[i]
return result
还有一种方法使用了前缀和+贪心的方法:53. 最大子数组和 - 力扣(LeetCode)
详细灵神的题解 :
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
ans = -inf
min_pre_sum = pre_sum = 0
for x in nums:
pre_sum += x # 当前的前缀和
ans = max(ans, pre_sum - min_pre_sum) # 减去前缀和的最小值
min_pre_sum = min(min_pre_sum, pre_sum) # 维护前缀和的最小值
return ans
二.
力扣53题最大子数组和算法解析
530

被折叠的 条评论
为什么被折叠?



