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

连续子数组最大和

http://www.nowcoder.com/practice/1718131e719746e9a56fb29c40cc8f95

双指针

  1. 两个指针代表子数组的边界(包含)
  2. 如果区间的和 +a[j] < a[j], 说明区间和为负 此时我们就要移动左边界 i, 这样才有sum增大的可能性,否则继续移动右边界 j 移动过程中保证区间有效 i <= j < n
#include <bits/stdc++.h>
using namespace std;
int a[200002];
int main(){
    int n;
    scanf("%d", &n);
    for(int i=0; i<n; i++){
        scanf("%d", &a[i]);
    }
    int sum=0;          // sum 表示区间和
    int Max=-102;       // 记录sum的最大值
    for(int i=0, j=0; i<=j&&j<n;){
        if(sum+a[j]>=a[j]){
            sum += a[j];
            Max = max(sum, Max);
            j++;
        }
        else {
            sum -= a[i];
            i++;
        }
    }
    printf("%d", Max);
    return 0;
}

咳咳,这道题之前见过,这次又遇到还是想了半天,还是有必要记录一下。如有问题,还请指正。

全部评论

相关推荐

11-11 16:40
已编辑
门头沟学院 人工智能
不知道怎么取名字_:这个有点不合理了,相当于已经毕业了,但还是没转正,这不就是白嫖
点赞 评论 收藏
分享
饿魔:看到在线简历了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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