给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
1、方法一
通过数组记录到每个第i个元素为止,和的最大值,最终求数组元素的最大值。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
# 利用num[i]记录到第i个元素为止,和的最大值。最后返回数组num中的最大值。
nums[i] = max(nums[i], nums[i] + nums[i-1])
return max(nums)
同样地,也可以通过定义一个新的数组status记录最大值。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
status = [nums[0]]
for i in range(1, len(nums)):
if nums[i]+status[i-1] > nums[i]:
status.append(nums[i]+status[i-1])
else:
status.append(nums[i])
return max(status)
2、方法二
本质上和方法一是相同的,通过判断上一个元素的值的正负来决定数组dp中的值。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
size = len(nums)
# 判断数组是否为空(事实上,题目已经要求非空)
if size == 0:
return 0
#(这一语句应该是创建数组dp,且len(dp)=size,但是具体含义不清楚???)
dp = [0 for _ in range(size)]
dp[0] = nums[0]
for i in range(1, size):
# 判断第(i-1)个元素,如果大于0,则加入到新元素中,否则,保持原本的值。
if dp[i - 1] >= 0:
dp[i] = dp[i - 1] + nums[i]
else:
dp[i] = nums[i]
return max(dp)
最后,上面方法本质上是一致的,都是通过利用一个数组记录到第i个元素为止的最大值来实现的。