面试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)
相关推荐
怕浪猫5 小时前
Agent 工程化面试:从开发到部署的 5 个关键问题
面试·架构·github
用户6919026813396 小时前
LangChain 与 LangGraph:从「链」到「图」,一次讲清它们是什么、什么关系
面试·架构·设计
CoderYanger7 小时前
A.每日一题:856. 括号的分数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
tachibana27 小时前
Golang 中数组和切片的区别?
开发语言·后端·golang·数组·切片
Sam_Deep_Thinking8 小时前
CountDownLatch实现原理
java·后端·面试·程序员
范中勤8 小时前
Python 与 Java:模块、包、对象、反射核心差异总结
java·python·面试·反射·元类
晚风叙码8 小时前
MySQL 增删改查(CRUD)完全指南:从入门到面试
数据库·mysql·面试
夏幻灵17 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
时间的拾荒人1 天前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
沐言人生1 天前
又一个神级考公脑库-22,375篇真题终于按考点整理了
后端·面试