题意
给定n个正整数组成的数组,求平均数正好等于 k 的最长连续子数组的长度。
思路
某个连续子数组的平均数等于k可以转化为区间和等于k*(j-i+1)
如果用前缀和维护的话就是sum[j] - sum[i-1] = k * (j-i+1)
这里有个很巧妙的地方就是把每个数都减去k,这样就变成了sum[j]-sum[i-1] = 0
可以用哈希表维护 mp[x]表示前缀和为x的最早出现的位置
代码
package main import ( "fmt" ) func main() { //sum[j] - sum[i-1] = k*(j-i+1) var n,k int fmt.Scan(&n,&k) a := make([]int,n+1) for i := 1; i <= n; i ++ { fmt.Scan(&a[i]) } mp := make(map[int]int) sum := 0 ans := 0 mp[0] = 0 for i := 1; i <= n; i ++ { sum += a[i] - k if pos,ok := mp[sum]; ok { if ans < i - pos { ans = i - pos } }else{ mp[sum] = i } } if ans == 0 { ans = -1 } fmt.Println(ans) }