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

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

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

#include <iostream>using namespace std;

const int N = 100010;int a[N], f[N], g[N];int main() {int n;cin >> n;

for(int i = 0; i < n; i ++){
    cin >> a[i];
    f[i] = a[i];
    g[i] = a[i];
}    
int sum = a[0], minN = 0, maxN = a[0];
for(int i = 1; i < n; i ++){
    f[i] = max(f[i - 1] + a[i], a[i]);
    sum += a[i];
    if(f[i] > maxN) maxN = f[i]; 
}
// 找中间是否出现负数 因为如果数组全是正数 就不会经过环 在1 - n就是最大值了
// 所以要在 1 - n - 1寻找最小的包含负数的子数组
for(int i = 1; i < n - 1; i ++){
    g[i] = min(g[i - 1] + a[i], g[i]);
    if(g[i] < minN) minN = g[i];
}
int res = -1e9;
// 最后比较 在环内的数组大还是环外的大
res = max(sum - minN, maxN);
cout << res << endl;
return 0;

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
点赞 评论 收藏
分享
点赞 评论 收藏
分享
程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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