求数组的最大子数组的和,经典的DP问题
方法1 DP
很容易想到递推方程:
dp[i] = dp[i-1] + nums[i] if dp[i-1]>0 else nums[i]
class Solution1:
def maxSubArray(self,nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = [0 for i in range(len(nums))]
res = -float('inf')
for i in range(len(nums)):
if i == 0:
dp[i] = nums[0]
else:
dp[i] = max(nums[i],dp[i-1]+ nums[i])
res = max(dp[i], res)
return res
如果不用数组的形式,可以写成这样
class Solution2:
def maxSubArray(self,nums):
"""
:type nums: List[int]
:rtype: int
"""
curr_sum = 0
res = -float('inf')
for i in range(nums):
if curr_sum <=0:
curr_sum = nums[i]
else:
curr_sum += nums[i]
res = max(res, curr_sum)
return res
方法2 Greedy
顺序遍历数组,假设到当前位置数组的总和为sumer,那么只要找到当前位置子数组和最小的值miner,用sumer - miner即可,不断更新sumer 和 miner即可求出我们需要的值
class Solution3:
def maxSubArray(self, nums):
sumer, miner,res = 0,0,nums[0]
for i in range(len(nums)):
sumer += nums[i]
res = max(sumer - miner, res)
if sumer < miner:
miner = sumer
return res