后缀和或者前缀和
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 动态规划思想
# 用f(i)表示以第i个元素为结尾的所有子串中的 和最大的子串
# 求出来每个位置的f(i),然后就可以得到最大子数组和
# 也就是 ans = max_{0<=i<n} {f(i)}
# 那么如何求f(i)呢?
# f(i)有可能是前面的f(i-1)加上nums[i]
# 也有可能单是nums[i]
# f(i) = max{f(i-1)+nums[i], nums[i]}
n = len(nums)
ans = nums[0]
f_i = 0
for i in range(n):
f_i = max(nums[i], f_i+nums[i])
ans = max(ans, f_i)
return ans
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left = 0
right = len(nums) - 1
ans = nums[0]
s = sum(nums)
if s > ans:
ans = s
while left < right:
if nums[left] < nums[right]:
s -= nums[left]
left += 1
elif nums[left] < nums[right]:
s -= nums[right]
right -= 1
else: # 如果nums[left] = nums[right]
# 这个时候就需要判断nums[left+1] ? nums[right-1]
i, j= left, right
while i<j and nums[i]==nums[j]:
i += 1
j -= 1
if nums[i] > nums[j]:
s -= nums[right]
right -= 1
else:
s -= nums[left]
left += 1
if s > ans:
ans = s
return ans
nums = [1,2,-1,-2,2,1,-2,1,4,-5,4]
[2,1,-2,1,4]
ans = 6
我上面的双指针的方法是错误的,因为按双指针的思路,它的最大子数组是[2,1,-2,1,4,-5,4]