题目
服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,
数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,
给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minAverageLost,
找出数组中最长时间段,如果未找到则直接返回NULL。
输入描述
输入有两行内容,第一行为{minAverageLost},第二行为{数组},数组元素通过空格(” “)分隔,
minAverageLost及数组中元素取值范围为0~100的整数,数组元素的个数不会超过100个。
输出描述
找出平均值小于等于minAverageLost的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从0开始),
如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格(” “)拼接,多个下标对按下标从小到大排序。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1
0 1 2 3 4
输出
0-2
说明
输入解释:minAverageLost=1,数组[0, 1, 2, 3, 4]
前3个元素的平均值为1,因此数组第一个至第三个数组下标,即0-2
总结
这个题目本质是一个满足平均值条件的最大长度子数组搜索问题,重点在于正确理解和处理边界条件,以及高效计算子数组平均值。
def find_max_length_subarrays(minAvg, arr):
n = len(arr)
if n == 0:
return "NULL"
# 计算前缀和
prefix = [0] * (n + 1)
for i in range(n):
prefix[i + 1] = prefix[i] + arr[i]
max_len = 0
results = []
# 遍历所有子数组
for i in range(n):
# 提前终止:如果剩余长度小于当前最大长度,不可能找到更长的
if n - i <= max_len:
break
for j in range(i, n):
length = j - i + 1
subarray_sum = prefix[j + 1] - prefix[i]
average = subarray_sum / length
if average <= minAvg:
if length > max_len:
# 找到更长的,更新结果
max_len = length
results = [(i, j)]
elif length == max_len:
# 找到相同长度的,添加到结果
results.append((i, j))
if max_len == 0:
return "NULL"
# 按起始下标排序并格式化输出
results.sort()
return " ".join([f"{start}-{end}" for start, end in results])
if __name__ == '__main__':
minAvg = int(input())
arr = list(map(int,input().split()))
print(find_max_length_subarrays(minAvg, arr))