53.最大子数组和

后缀和或者前缀和

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值