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

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

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

#include <bits/stdc++.h>

using namespace std;


// 最大连续和 + 最小连续和 = sum ,二者和一就是sum 
int main() {
   int n;
   cin >> n;
   vector<int> arr(n);
   for(int i = 0; i < n; i++) cin >> arr[i];
   int sum,dpmx,dpmn,mx,mn;
   sum = dpmx = dpmn = mx = mn = arr[0];

   for(int i = 1; i < n; i++){
    dpmx = max(dpmx+arr[i],arr[i]);
    dpmn = min(dpmn+arr[i],arr[i]);
    mx = max(dpmx,mx);
    mn = min(dpmn,mn);
    sum += arr[i];
   }
   if(mx < 0) { // 最大和都为负数! 双边都为负数! 
    cout << mx << endl;
    return 0;
   }
   
   if(mx + mn < sum) cout << sum - mn << endl; // 交接区域属于最大大连续和领域!
   else cout << mx << endl;  // 交界区域属于最小连续和领域! 
   return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务