面试150 环形子数组的最大和

思路

通过分情况处理,先求出非环形情况下的最大子数组和(max_sum),然后用类似方式求出最小子数组和(min_sum)。由于环形最大子数组可能由总数组和减去中间最小子数组得到,因此再计算总和 total - min_sum 与 max_sum 进行比较,取两者的较大值作为最终答案。注意到如果数组全为负数,此时 total - min_sum 等于 0,会误导结果,因此单独判断 max_num < 0 的情况,直接返回最大值,避免错误。该方法充分利用了Kadane算法的优雅特性,时间复杂度为 O(n)。

python 复制代码
class Solution:
    def maxSubarraySumCircular(self, nums: List[int]) -> int:
        def max_sum(nums):
            cur=max_num=nums[0]
            for num in nums[1:]:
                cur=max(num,num+cur)
                max_num=max(max_num,cur)
            return max_num
        
        def min_sum(nums):
            cur=min_num=nums[0]
            for num in nums[1:]:
                cur=min(num,num+cur)
                min_num=min(min_num,cur)
            return min_num
        
        total=sum(nums)
        max_num=max_sum(nums)
        min_num=min_sum(nums)
        if max_num<0:
            return max_num #如果没有这样的话,最后会返回0,不走下面那步
        return max(max_num,total-min_num)
相关推荐
努力的小郑12 分钟前
Spring 的西西弗斯之石:理解 BeanFactory、FactoryBean 与 ObjectFactory
后端·spring·面试
瑞雨溪23 分钟前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展
程序员-King.26 分钟前
day125—二分查找—寻找峰值(LeetCode-162)
算法·leetcode·职场和发展
鹏程十八少40 分钟前
1.Android 3分钟跑通腾讯 Shadow 插件化官方Demo:零反射、手把手实战(基于源码依赖)
android·前端·面试
前端小白在前进1 小时前
优雅的使用Nexent创建与部署前端面试智能体
前端·面试·职场和发展
阿蒙Amon1 小时前
C#每日面试题-Array和List的区别
面试·c#
码农水水1 小时前
阿里Java面试被问:RocketMQ的消息轨迹追踪实现
java·开发语言·windows·算法·面试·rocketmq·java-rocketmq
"YOUDIG"1 小时前
信稿笺纸设计工具:传统排版美学与数字化设计的高效融合
科技·考研·算法·面试·职场和发展·高考
点云SLAM2 小时前
C++设计模式之单例模式(Singleton)以及相关面试问题
c++·设计模式·面试·c++11·单例模式(singleton)
熏鱼的小迷弟Liu4 小时前
【消息队列】RabbitMQ的基本架构?
面试·架构·rabbitmq