大小为 K 且平均值大于等于阈值的子数组数目
给你一个整数数组 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 。注意平均值不是整数。
提示:
1 <= arr.length <= 105
1 <= arr[i] <= 104
1 <= k <= arr.length
0 <= threshold <= 104
题目解析:
计算长度大小为k的子数组的平均值,将平均值与threshold比较,返回平均值大于threshold的子数组的数目
解法思路:
1.暴力解法,计算出所有子数组的平均值,然后一一比较,得到返回值返回,时间复杂度O(nk)
2.定长滑动窗口,题目给出了子数组的长度k,那么套用定长滑动窗口解题步骤:
- 入窗口
- 判断+出窗口
- 更新结果
注意:更新结果需确保滑动窗口大小为k
代码:
class Solution {
public:int numOfSubarrays(vector<int>& arr, int k, int threshold) {int left=0,right=0,cnt=0;double ave=0,sum=0;for(;right<arr.size();right++){//入窗口sum+=arr[right];if(right - left+1 <k)continue;//判断if(right - left+1 >k)sum-=arr[left++];//更新结果,保整窗口大小为kave=sum/k;if(ave>=threshold){cnt++;ave=INT_MIN;}} return cnt;}
};