【leetcode】1343_ 大小為 K 且平均值大於等於閾值的子陣列數目
阿新 • • 發佈:2020-07-15
連結
描述
給你一個整數陣列 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 = [1,1,1,1,1], k = 1, threshold = 0
輸出:5
AC程式碼
1.首先這道題的子陣列指的是原陣列中連續的k個數組成的陣列,因此,原來的陣列是不能夠排序的。
2.如果子陣列的和arr_sum大於等於k*threadhold則滿足條件的子陣列數量+1
3.利用滑窗法求解
3.1 求前k個數的和arr_sum,看是否滿足條件
3.2 視窗向後滑動: arr_sum減上子陣列中第一個元素的值,再加上陣列後一位數的值。
class Solution { public: int numOfSubarrays(vector<int>& arr, int k, int threshold) { int sum=0,result=0; int sumtarget=k*threshold; for(int i=0;i<k;i++) { sum+=arr[i]; } //前k個數之和 int tmp=sum-sumtarget; if(tmp>=0) result++; //sum大於等於目標值則記錄 int pos=k; for(int i=0;i<arr.size()-k;i++) { tmp=tmp+arr[pos]-arr[i]; //滑窗法,加上後面一個數減去第一個數 if(tmp>=0) result++; pos++; } return result; //返回記錄值 } };