Leetcode-D5-53. 最大子数组和&918. 环形子数组的最大和

一、53. 最大子数组和

1、没什么想法啊,看看答案叭

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # 设f(i)是以i结尾的最大和连续子数组的和
        #我们的目标是找到max{f(i)}
        #f(i)=max{f(i-1)+nums[i],nums[i]}
        p = nums[0]
        n = len(nums)
        if len(nums)==1:
            return nums[0]
        for i in range(1,n):
            r = max(p+nums[i],nums[i])
            result = max(p,r)
            p = r
        return result

不知道哪里有问题
我的妈呀。。。。
2、順便看了下sublime如何調試
Leetcode-D5-53. 最大子数组和&918. 环形子数组的最大和_第1张图片

不太會用,放棄了。

3、

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        # 设f(i)是以i结尾的最大和连续子数组的和
        #我们的目标是找到max{f(i)}
        #f(i)=max{f(i-1)+nums[i],nums[i]}
        p = nums[0]
        n = len(nums)
        result = p
        if len(nums)==1:
            return nums[0]
        for i in range(1,n):
            r = max(p+nums[i],nums[i])
            result = max(result,r)
            p = r
        return result

整体思路没有问题,只是刚刚是在比较p和r的最大值,其实要比较的是之前所有f的最大值和现在的f的值,用result记录到目前为止f的最大值。
Leetcode-D5-53. 最大子数组和&918. 环形子数组的最大和_第2张图片

二、918. 环形子数组的最大和

1、好难,没有思路
2、Leetcode-D5-53. 最大子数组和&918. 环形子数组的最大和_第3张图片

这图画的真的很不错!!!!
有环的情况可以分类讨论。
(1)没有跨界
就和53题一样
(2)跨界
找两端最大的,就相当于找没跨界的最小的。
设f(i)是到第i个的连续最小和
则f(i)=min{f(i-1)+nums[i],nums[i}

3、还是不多,

class Solution:
    def maxSubarraySumCircular(self, nums: List[int]) -> int:
        n = len(nums)
        if len(nums)==1:
            return nums[0]
        #没有跨界
        p = nums[0]
        n = len(nums)
        result_f = p

        for i in range(1,n):
            r = max(p+nums[i],nums[i])
            result_f = max(result_f,r)
            p = r
        max_f=result_f
        
        #跨界
        q = nums[0]
        result_t_1 = q
        for i in range(1,n-1):
            s = min(q+nums[i], nums[i])
            result_t_1 = min(result_t_1,s)
            q = s
        max_t_1 = sum(nums)-result_t_1

        q = nums[0]
        result_t_2 = q
        for i in range(2,n):
            s = min(q+nums[i], nums[i])
            result_t_2 = min(result_t_2,s)
            q = s
        max_t_2 = sum(nums)-result_t_2

        return max(max_f,max_t_1,max_t_2)

4、debug后发现先问题:
为了不让全部用来输出最小值,又因为是连续的,所以我限制其最多从第一个开始连续到倒数第二个;或者从第二个开始连续到最后一个。
但是在写从第二个开始连续的时候,忘记更改最左侧值为第二个nums[1],最左侧值值还是第一个nums[0】,导致错误,修改如下:

class Solution:
    def maxSubarraySumCircular(self, nums: List[int]) -> int:
        n = len(nums)
        if len(nums)==1:
            return nums[0]
        #没有跨界
        p = nums[0]
        n = len(nums)
        result_f = p

        for i in range(1,n):
            r = max(p+nums[i],nums[i])
            result_f = max(result_f,r)
            p = r
        max_f=result_f

        #跨界
        q = nums[0]
        result_t_1 = q
        for i in range(1,n-1):
            s = min(q+nums[i], nums[i])
            result_t_1 = min(result_t_1,s)
            q = s
        max_t_1 = sum(nums)-result_t_1

        q = nums[1]
        result_t_2 = q
        for i in range(2,n):
            s = min(q+nums[i], nums[i])
            result_t_2 = min(result_t_2,s)
            q = s
        max_t_2 = sum(nums)-result_t_2

        return max(max_f,max_t_1,max_t_2)

通过!

你可能感兴趣的:(动态规划,leetcode,算法,职场和发展)