题解 | 环形数组的连续子数组最大和

环形数组的连续子数组最大和

https://www.nowcoder.com/practice/53a9f1ba687440cc9c641c2b042a59d7

import sys

# 9:55

# 两种情况
# 1 最大值不过环,按正常线性数组来求
# 2, 最大值过环,这个连续过环的数组的和,等于整个数组的和减去这个环头和尾的和,相当于最大的过环连续子数组和,等于整个数组的和,
# 减去线性里连续的子数组的最小和。 
# 特殊情况 (1) 如果数组全为负数,要求非空,那么此时最大值为max(nums)
# (2) 如果数组全为正数,此时最大值为整体和,这个可以处理,主要需要处理一下情况(1)

n = int(input())

nums = list(map(int, input().split()))
total = sum(nums)

dp1 = [0] * (n+1) # 以i结尾的连续子数组和的最大值
dp2 = [0] * (n+1) # 以i结尾的连续子数组和的最小值

dp1[0] = - 10**4 -1
dp2[0] = 10 ** 4 + 1
for i in range(1,n+1):
    dp1[i] = max(dp1[i-1]+nums[i-1],nums[i-1])
    dp2[i] = min(dp2[i-1]+nums[i-1],nums[i-1])

if max(nums)<=0 : # 不能为全负or0   ,
    print(max(dp1))
else:
    print(max(max(dp1),total-min(dp2)))



全部评论

相关推荐

当初高考报计算机真是造大孽了啊!卷的飞起!哪都是计算机的人,考研,考公,找工作全他奶的计算机的人,太难了。国企也是。关键一届比一届卷,造大孽了!
_Lyrics_:因为计算机,没有体验到快乐的大学研究生时光,好不容易修完课程就要出去实习,看着别人专业可以一起搓麻将,游山玩水,而我却要自己一个人住在北上不到十平米的出租屋,每天两点一线
点赞 评论 收藏
分享
求offer的大角牛:不吃香菜
点赞 评论 收藏
分享
05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务