指尖划过的轨迹,藏着最细腻的答案~
题目:
给你一个整数数组 arr 和两个整数 k 和 threshold 。
请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。
示例 1:
输入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4
输出:3
解释:子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4,5 和 6 。其他长度为 3 的子数组的平均值都小于 4 (threshold 的值)。
示例 2:
输入:arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5
输出:6
解释:前 6 个长度为 3 的子数组平均值都大于 5 。注意平均值不是整数。
提示:
分析:
本题所找的最大平均数,即是最大连续子数组的和。相当于从前k个元素开始,每次最前面丢掉一个,最后面增加一个,在这个过程中统计窗口k中的数字之和,这就是定长滑动窗口:窗口大小不变,恒定为k。
具体的由于本题有负数,因此我们可以将第一窗口的和初始化为统计的最大值ans,然后在遍历剩余的数字,更新最大值ans;而统计数量时为了避免出现小数的精度损失,我们可以计算定长滑动窗口的阈值k * threshold。
AC代码:
class Solution {
public:
int numOfSubarrays(vector<int>& arr, int k, int threshold) {
int ans = 0, sum = 0;
for (int i = 0; i < k; i++) {
sum += arr[i];
}
if (sum >= k * threshold) {
ans++;
}
for (int i = k; i < arr.size(); i++) {
sum -= arr[i - k];
sum += arr[i];
if (sum >= k * threshold) {
ans ++;
}
}
return ans;
}
};