大小为k且平均值大于等于阈值的子数组数目-LeetCode
1343. 大小为 K 且平均值大于等于阈值的子数组数目
🎯 问题描述(来源于LeetCode)
描述:给你一个整数数组 arr 和两个整数 k 和 threshold。请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。
说明:
-
子数组是数组中连续的元素序列。
-
为了方便计算,我们将“平均值 阈值”转化为“总和 阈值 长度”,避免浮点数运算。
-
示例:
-
示例 1:
1 | 输入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4 |
- 示例 2:
1 | 输入:arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5 |
💻 解题思路
思路1:定长滑动窗口
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
提交结果
- 运行时间:51 ms66.40% 的用户
- 内存消耗:29.63 MB22.89% 的用户
复杂度验证
- 时间复杂度:
- 其中 是数组
arr的长度。代码只对数组进行了一次线性遍历,每个元素最多被访问两次(一次加入窗口,一次移出窗口)。
- 其中 是数组
- 空间复杂度:
- 只使用了
count和count_num等常数个变量,没有使用额外的数组或数据结构。
- 只使用了
思考
- 去浮点化技巧:题目要求平均值,但直接计算平均值涉及除法和浮点数比较,容易产生精度误差。将条件
avg >= threshold转化为sum >= threshold * k是处理此类问题的标准技巧。 - 滑动窗口的精髓:相比于暴力解法(双重循环,每次重新计算 个数的和),滑动窗口通过维护一个累加和变量,利用“增量更新”的方式,将时间复杂度从 优化到了 。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






