15天大厂真题带刷 - ZT27平均数为k的最长连续子数组

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

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

题意

给定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)
}

#牛客创作赏金赛#
15天大厂真题带刷Go题解 文章被收录于专栏

15天大厂真题带刷Golang题解

全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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