方法一:暴力法
\quad
双重for循环,第一层循环遍历左指针(最大子序的起始位置),第二层循环遍历右指针(最大子序的结束位置),时间复杂度
O
(
n
2
)
O(n^2)
O(n2)。
方法二:贪心法
class Solution:
def maxSubArray(self, nums):
res = nums[0]
s = 0
for num in nums:
if s > 0:
s += num
else:
s = num
res = max(res, s)
return res
\quad
定义变量s, result,s表示以当前索引作为结束位置的最大子序和,res则表示当前最大子序和,初始化s=0,res=nums[0],如果s>0表明上一个索引作为结束位置的最大子序和>0,那么当前索引作为结束位置的最大子序和直接加上当前值就好了,如果s<0表明上一个索引作为结束位置的最大子序和<0,那么当前索引作为结束位置的最大子序和就是当前值。
方法三:动态规划
class Solution:
def maxSubArray(self, nums):
for i in range(1, len(nums)):
if nums[i-1] > 0:
nums[i] += nums[i-1]
return max(nums)
\quad 遍历计算以每个索引作为结束位置的最大子序和,如果上一个索引作为结束位置对应最大子序和>0,那么显然当前索引作为结束位置的最大子序和为当前值加上上一个索引作为结束位置的最大子序和。