面试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)
相关推荐
ricardo19731 天前
# Tree Shaking 深度解析:为什么你的代码没被摇掉?
前端·面试
小江的记录本1 天前
【Java基础】反射与注解:核心原理、自定义注解、注解解析方式(附《思维导图》+《面试高频考点清单》)
java·数据结构·python·mysql·spring·面试·maven
罗超驿1 天前
19.告别复杂SQL!用MySQL视图把逻辑拆成“变量”式操作
数据库·mysql·面试
中小企业实战军师刘孙亮1 天前
家居建材营销新趋势:数字化、体验式与可持续方向-佛山鼎策创局破局增长咨询有限公司
职场和发展·产品运营·创业创新·需求分析·学习方法
凯瑟琳.奥古斯特1 天前
传输层核心功能解析
开发语言·网络·职场和发展
jiayong231 天前
前端面试题库 - 浏览器与网络篇
前端·网络·面试
一叶遮惊鸿1 天前
从零构建 AI 驱动的日志监控自愈系统
面试
李小狼lee1 天前
《spring如此简单》第四节--IOC思想的实现,spring启动后发生了什么
后端·面试
2301_800895101 天前
计算机网络保研面试(自用版h)
计算机网络·面试
SamDeepThinking1 天前
面试官问Bean线程安全,你该从架构角度回答
java·后端·面试