[leetcode 10-06] 三、环形子数组的最大和(以前刷到一题,只算开头一个数,该题皆可环)

在这里插入图片描述

按照只算开头一个环形的思路
在这里插入图片描述

在这个算例爆了

        def getDPmax(numsIn):
            if len(numsIn) == 1: return numsIn[0]
            dp = [0] * len(numsIn)
            dp[0] = numsIn[0]
            for i in range(1,len(numsIn)):
                if dp[i-1] > 0:
                    dp[i] = dp[i-1] + numsIn[i]
                else:
                    dp[i] = numsIn[i]
            return max(dp)
        # 这个环可任意取前n个
        ans = []
        for i in range(len(nums)):
            nums_b = nums[:i]
            nums_a = nums[i:]
            nums1 = nums_a + nums_b
            ans.append(getDPmax(nums1))
        return max(ans)

看了大佬的思路
在这里插入图片描述

而最大最小的求解:
在这里插入图片描述

如果求最小,直接改成min即可

		n=len(nums)   
        max_=float('-inf')
         
        pre=0 #无环
        for i in range(n):
            pre=max(0,pre)+nums[i]
            max_=max(max_,pre)
        # 如果最子数组和小于0,说明数组中全为负数,返回最大负数即可
        if max_<0:return max_
        #有环
        pre=0
        min_=float('inf')
        for i in range(n):
            pre=min(0,pre)+nums[i]
            min_=min(min_,pre)
        
        return max(max_,sum(nums)-min_)

根据图片求解得到

猜你喜欢

转载自blog.csdn.net/weixin_45492560/article/details/120625163