1. 程式人生 > 實用技巧 >【leetcode】1343_ 大小為 K 且平均值大於等於閾值的子陣列數目

【leetcode】1343_ 大小為 K 且平均值大於等於閾值的子陣列數目

連結

[https://leetcode-cn.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold/]
難度中等


描述

給你一個整數陣列 arr 和兩個整數 kthreshold

請你返回長度為 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;  //返回記錄值
    }
};