通过率 52% · 提交 882 · 通过 456
小慕在维护一个微服务系统时,发现服务之间接口调用的成功率是衡量系统质量的关键指标。他记录了某个时间段内每个单位时间的接口失败率,这些数据用一个整数数组表示,数组中的每个元素取值在 0 到 100 之间。现在,小慕设定了一个平均失败率容忍值 ,要求找出数组中满足平均失败率小于等于该容忍值的最长连续时间段。如果不存在这样的时间段,则返回 NULL。
这类题属于华为 OD 机考真题方向中「200分 / 2024E」方向的高频题型,通常考察对「200分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入有两行内容,第一行为minAverageLost,第二行为数组,数组元素通过空格" "分隔,minAverageLost 及数组中元素取值范围为 0~100 的整数,数组元素的个数不会超过 100 个。
找出平均值小于等于 minAverageLost 的最长时间段,输出数组下标对,格式{beginIndex}-{endIndx}(下标从 0 开始),如果同时存在多个最长时间段,则输出多个下标对且下标对之间使用空格" "拼接,多个下标对按下标从小到大排序。
示例 1
输入示例
2 0 0 100 2 2 99 0 2
输出示例
0-1 3-4 6-7
A、输入解释:minAverageLost = 2,数组[0, 0, 100, 2, 2, 99, 0, 2] B、通过计算小于等于 2 的最长时间段为:数组下标为 0-1 即[0, 0],数组下标为 3-4 即[2, 2],数组下标为 6-7 即[0, 2],这三个部分都满足平均值小于等 2 的要求,因此输出 0-1 3-4 6-7
示例 2
输入示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题数据规模不大,可以用暴力法枚举所有的区间来解决。暴力法略去不表,这里主要讲解复杂度较优秀的解法。
由于题目要求找到数组中平均失败率小于等于 minAverageLost 的最长时间段,我们贪心地优先从区间长度更大的情况开始考虑。
对于已知长度为 n 的数组 nums 而言,其中的连续子区间的长度 l 的最大值即为 n。故我们可以从 n 开始到 1 结束,逆序遍历连续子区间的长度 l,即:
一旦发现,对于某一个固定长度 l,我们能够找到长度为 l 的连续区间的区间和的平均值小于等于 minAverageLost,则说明我们一定找到了最长的满足题意的区间。
由于计算平均值涉及除法,我们在计算过程中应尽量避免除法(尤其是可能出现不整除的情况)。
对于某个特定的 l,连续区间的长度已经确定为 l,假设连续区间和为 interval_sum,那么满足题意的式子 interval_sum / l <= minAverageLost 可以转化为 interval_sum <= minAverageLost * l。
设阈值 threshold = minAverageLost * l,我们就可以把问题进一步转化为:求在特定 l 的情况下,存在哪些区间满足条件 interval_sum <= threshold。
剩下的问题,就是解决如何方便地计算长度为 l 的连续区间和。计算连续子数组的和相关的题目,一般使用滑窗或者前缀和来解决。
对于某一个确定的 l 值,我们可以使用固定滑窗算法来计算连续区间和(即窗口和)interval_sum。整个过程的核心代码为:
考虑前缀和技巧。构建前缀和数组为 pre_sum(注意前缀和数组的大小比原数组 nums 多一位,为 n+1)。我们可以枚举所有区间的起始点 i,那么所有长度为 l 的连续区间和可以表示为 pre_sum[i+l] - pre_sum[i]。
这里唯一的难点在于确定起始位置 i 的范围。我们可以通过取特殊边界值代入的方式来确定:
l = n:原数组仅存在一个连续区间 nums[0:n],区间和 interval_sum = pre_sum[n] - pre_sum[0],i 的范围应该是 range(0, 1)。考虑右边界,1 = n - n + 1 = n - l + 1,故确定区间范围应该是 range(0, n-l+1)。l = 1:考虑原数组最后一个连续区间 nums[n-1:n],区间和 interval_sum = pre_sum[n] - pre_sum[n-1],i 的范围应该是 range(0, n)。考虑右边界,n = n - 1 + 1 = n - l + 1,故确定区间范围应该是 range(0, n-l+1)。故整个过程的核心代码为:
解法一:前缀和
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
1 0 1 2 3 4
输出示例
0-2
A、输入解释:minAverageLost=1,数组[0, 1, 2, 3, 4] B、前 3 个元素的平均值为 1,因此数组第一个至第三个数组下标,即 0-2
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有