题解 | #平均数为k的最长连续子数组#

平均数为k的最长连续子数组

https://www.nowcoder.com/practice/2e47f99735584ac5ba30d75ac14d6524

当长为 len 的平均数等于 k 时,代表区间的和为 len*k ,特别的,当 k 为 0 时,区间的和也为0,代表 sum[r] == sum[l-1] ,所以我们可以先简化题意,将每一项都减去 k ,来求区间平均数为 0 的最长区间,那么对于每个区间前缀和 sum ,一定是和之前值等于 sum ,且下标最小的一项构成最长区间,所以我们可以使用 map 维护每个前缀和值最早出现的下标,如果一个前缀和之前出现过,就用他们两个的下标来更新答案,最后维护最大的答案即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int __t = 1, n, k, x;
void solve() {
    cin >> n >> k;
    int sum = 0, ans = -1;
    map<int, int> mp;
    mp[0] = 0;
    for (int i = 1; i <= n; i++) {
        cin >> x;
        sum += x - k;
        if (mp.count(sum))
            ans = max(ans, i - mp[sum]);
        else
            mp[sum] = i;
    }
    cout << ans << '\n';
    return;
}
int32_t main() {
#ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);
    cin.tie(0);
#endif
    // cin >> __t;
    while (__t--)
        solve();
    return 0;
}

全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
投票
我要狠拿offer:如果不是必须去成都绝对选九院呀,九院在四川top1研究所了吧
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务