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

连续子数组最大和

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;
}

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

全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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