算法题:平均数为k的最长连续子数组

问题描述

1.题目描述

给定 n个正整数组成的数组,求平均数正好等于 k 的最长连续子数组的长度。

2.I/O描述

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

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

3.I/O示例

示例1
输入例子:
5 2
1 3 2 4 1
输出例子:
3
例子说明:
取前三个数即可,平均数为2。


算法分析:

1.把原数组nums中每一个元素都减去k得到一个新数组
2.构建前缀和数组(前面补0 防止答案在最前端)
3.找到数组中距离最远的元素(用哈希辅助)


具体代码

# 数据输入
a = input().split()
length = int(a[0])
avg = int(a[1])
info = input().split()
# 获得新数组
int_array = [int(char) - avg for char in info]

# 初始化前缀、数组和字典
s = [0]
ans_dt = {}


# 构建前缀和数组
for i in range(1, length+1):
    item = s[i - 1] + int_array[i - 1]
    s.append(item)

# 获取相同元素的最远距离
ans = -1
for i in range(len(s)):
    if s[i] not in ans_dt.keys():
        ans_dt[s[i]] = i
    else:
        ans = max(ans, i - ans_dt[s[i]])

print(ans)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值