题解 | #子数组绝对值的最大值#

子数组绝对值的最大值

https://www.nowcoder.com/practice/200e7c7ad80741428c35119098aa39d1

子数组的和可以表示为两个前缀和的差值。 设 为数组 的前缀和,即 ,并定义 。 那么,从索引 的子数组和 可以表示为:

我们要找的最大值是 。 根据绝对值的性质, 实际上是所有前缀和(包括 )中任意两个值之间的最大差值

要最大化 ,我们只需要找到所有前缀和中的最大值最小值,然后计算它们之间的差值。

假设:

  • 所有前缀和中的最大值是
  • 所有前缀和中的最小值是

那么,子数组和的绝对值的最大值就是:

代码:

#include <bits/stdc++.h>
#include <limits>
using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    ll maxPrefix = 0;
    ll minPrefix = 0;
    ll curSum = 0;

    for (int i = 0; i < n; i++) {
        int a;
        cin >> a;
        curSum += a;
        maxPrefix = max(maxPrefix, curSum);
        minPrefix = min(minPrefix, curSum);
    }

    cout << (maxPrefix - minPrefix) << endl;
}
算法编程训练 文章被收录于专栏

各类牛客算法编程训练联赛、集训营

全部评论
为什么把那俩个maxPrefix初始化位LLONG_MIN ,minPrefix初始化位LLONG_MAX会有一个样例过不去呢
点赞 回复 分享
发布于 02-07 18:39 辽宁

相关推荐

评论
4
1
分享

创作者周榜

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