首页 > 试题广场 >

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

[编程题]平均数为k的最长连续子数组
  • 热度指数:3399 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定n正整数组成的数组,求平均数正好等于 k 的最长连续子数组的长度。

输入描述:
第一行输入两个正整数nk,用空格隔开。
第二行输入n个正整数a_i,用来表示数组。




输出描述:
如果不存在任何一个连续子数组的平均数等于k,则输出-1。
否则输出平均数正好等于 k 的最长连续子数组的长度。

示例1

输入

5 2
1 3 2 4 1

输出

3

说明

取前三个数即可,平均数为2。
头像 Locam
发表于 2023-09-03 01:29:24
前缀和+哈希表思路:将输入数组中的元素减去k可将题目转化为“和为0的最长连续子数组”。进一步,为省去重复计算,使用前缀和处理数组。使用哈希表记录前缀和数组中每个值第一次出现的位置,遍历数组找到相同的值便计算距离并更新最大值即可。上述前缀和数组可优化为一个变量。python参考代码: import s 展开全文
头像 宿伞之神
发表于 2024-11-21 19:00:56
先将数组里面的每个数都减 ,然后找最长的和为 的连续段,我们用前缀和加速,设数组 为前缀和数组,对于每个 我们只需要找到 数组最靠前的值为 的位置即可,这个用 存一下即可。 #include<bits/stdc++.h> #define int long long #def 展开全文
头像 阿里嘎多懒羊羊桑_
发表于 2024-11-23 11:45:31
题意给定n个正整数组成的数组,求平均数正好等于 k 的最长连续子数组的长度。思路某个连续子数组的平均数等于k可以转化为区间和等于k*(j-i+1)如果用前缀和维护的话就是sum[j] - sum[i-1] = k * (j-i+1)这里有个很巧妙的地方就是把每个数都减去k,这样就变成了sum[j]- 展开全文
头像 Mag1c0nch
发表于 2024-11-21 19:31:46
当长为 len 的平均数等于 k 时,代表区间的和为 len*k ,特别的,当 k 为 0 时,区间的和也为0,代表 sum[r] == sum[l-1] ,所以我们可以先简化题意,将每一项都减去 k ,来求区间平均数为 0 的最长区间,那么对于每个区间前缀和 sum ,一定是和之前值等于 sum 展开全文
头像 12316534
发表于 2024-11-21 19:51:07
from itertools import accumulate n,k=map(int,input().split()) number=list(map(int,input().split())) for i in range(n): number[i]-=k number1=list(a 展开全文
头像 zlff
发表于 2024-11-22 19:35:41
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ull; int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; typedef 展开全文
头像 Kato_Shoko
发表于 2024-11-22 21:18:59
#include <iostream> #include <queue> #include <map> #include <set> #include <cmath> #include <cstring> #include &l 展开全文
头像 君鸿
发表于 2024-12-18 16:04:51
思路:将输入数组的每个元素减去k,即可将题目转化为求“和为0的最长连续子数组”。使用前缀和的思想,我们维护一个变量sum。并用哈希表记录前缀和为sum的最小位置。假设前i个元素和为sum,前j个元素和也为sum,那么毫无疑问,第i+1个元素开始直到第j个元素之和必然为0。根据这个思路,我们遍历一遍数 展开全文
头像 努力变强2
发表于 2024-11-21 18:25:44
同时减去k后, 求最长连续子数组和为0的值即可 代码: using namespace std; typedef long long ll; typedef pair<ll, ll>PII; const int N = 2e5 + 10; const int MOD = 998244 展开全文
头像 叫啥名
发表于 2025-05-26 14:38:58
// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432 // 我这个是参考的题解的思路(把输入的每个值-k,转化为寻找最长的连续和为0的连续区间,用了前缀和优化)写的,不过我的思路是:记录每个数的第一次和最后一次出现的 展开全文