首页 > 其他分享 >[LeetCode] 1343. Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold 大小为 K

[LeetCode] 1343. Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold 大小为 K

时间:2023-05-16 12:44:46浏览次数:50  
标签:arr Sub arrays Average int 数组 threshold size


Given an array of integers arr and two integers k and threshold, return *the number of sub-arrays of size k and average greater than or equal to *threshold.

Example 1:

Input: arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4
Output: 3
Explanation: Sub-arrays [2,5,5],[5,5,5] and [5,5,8] have averages 4, 5 and 6 respectively. All other sub-arrays of size 3 have averages less than 4 (the threshold).

Example 2:

Input: arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5
Output: 6
Explanation: The first 6 sub-arrays of size 3 have averages greater than 5. Note that averages are not integers.

Constraints:

  • 1 <= arr.length <= 10^5
  • 1 <= arr[i] <= 10^4
  • 1 <= k <= arr.length
  • 0 <= threshold <= 10^4

这道题给了一个正整数数组 arr,和两个参数k,threshold。说是让找出所有长度为k的子数组的个数,使得该子数组的平均值大于等于 threshold。子数组的平均值的计算方法即为子数组之和除以其长度,这里就是除以k。而求子数组之和的问题,博主下意识的就会想到建立累加和数组,这样可以快速求出任意长度的子数组之和。这里也可以用这种方法,建立累加和数组 sums,然后就是遍历所有的长度为k的子数组,然后通过 sums[i]-sums[i-k] 快速得到其数组之和。接下来就要进行比较了,这里博主没有使用除法,因为除法没有乘法高效,用k乘以 threshold 的结果进行比较也是一样的,若满足条件,则结果自增1即可,参见代码如下:


解法一:

class Solution {
public:
    int numOfSubarrays(vector<int>& arr, int k, int threshold) {
        int res = 0, n = arr.size(), target = k * threshold;
        vector<int> sums(n + 1);
        for (int i = 1; i <= n; ++i) {
            sums[i] = sums[i - 1] + arr[i - 1];
        }
        for (int i = k; i <= n; ++i) {
            int sum = sums[i] - sums[i - k];
            if (sum >= target) ++res;
        }
        return res;
    }
};

由于这道题只关心长度为k的子数组,那么建立整个累加和数组就略显多余了,只要维护一个大小为k的窗口就能遍历所有长度为k的子数组了。这就是滑动窗口 Sliding Window 的思路,遍历数组,将当前数字加到 sum 中,若i大于等于k,说明此时窗口大小超过了k,需要把左边界 arr[i-k] 减去,然后把 sum 跟 target 进行比较,注意这里的i必须要大于等于 k-1,因为要保证窗口的大小正好是k,参见代码如下:


解法二:

class Solution {
public:
    int numOfSubarrays(vector<int>& arr, int k, int threshold) {
        int res = 0, n = arr.size(), sum = 0, target = k * threshold;
        for (int i = 0; i < n; ++i) {
            sum += arr[i];
            if (i >= k) sum -= arr[i - k];
            if (i >= k - 1 && sum >= target) ++res;
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1343


类似题目:

K Radius Subarray Averages

Count Subarrays With Median K


参考资料:

https://leetcode.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold

https://leetcode.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold/solutions/503786/c-short-solution/

https://leetcode.com/problems/number-of-sub-arrays-of-size-k-and-average-greater-than-or-equal-to-threshold/solutions/502740/java-python-3-2-codes-prefix-sum-and-sliding-window-w-analysis/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:arr,Sub,arrays,Average,int,数组,threshold,size
From: https://www.cnblogs.com/grandyang/p/17405025.html

相关文章

  • php substr中文乱码最有效到解决办法
    直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半。解决办法:1、使用mbstring扩展库的mb_substr截取就不会出现乱码了。2、自己书写截取函数,但效率不如用mbstring扩展库来得高。3、如果仅是为了输出截取的串,可用如下方式实现......
  • CF1794C Scoring Subsequences题解
    文中\(a\)为题目中给的\(a\)。如果我们要求\(a_1,a_2,a_3,\dots,a_m\)的结果,那么我们可以把\(a\)数组从后往前依次除以\(i\),\(i\)从\(1\)到\(n\),即为\(\frac{a_1}{m},\frac{a_2}{m-1},\frac{a_3}{m-2},\dots,\frac{a_{m-1}}{2},\frac{a_m}{1}\),并将其保......
  • CFDEM中的subModels文件夹有两个
    CFDEM中在编译成功之后,subModels总共有两个,两个文件夹的解释以及其路径分别为:第一个文件夹:CFDEM各种子模型的源文件夹cfdem@DESKTOP-BVOE5IL:~/CFDEM/CFDEMcoupling-PUBLIC-5.x/src/lagrangian/cfdemParticle/subModels$pwd/home/cfdem/CFDEM/CFDEMcoupling-PUBLIC-5.x/src/la......
  • Bilibili-XMLSubtitle-to-ASS可视化Bilibili本地视频XML弹幕转换ASS字幕转换器:新增自
    可视化Bilibili本地视频XML弹幕转换ASS字幕转换器一个可视化,打开即用的将B站弹幕转换为本地播放器可识别的ASS格式字幕的工具。另外这个工具还有一个妙用,如果你想看一部曾经在B站上存在过但现在下架了的电视剧/电影的弹幕,用这个工具也能多多少少帮你做到这一点,具体方式请往下看......
  • #Mitsubishi/三菱 PLC张力控制通用程序模板 采用三菱伺服F
    #Mitsubishi/三菱PLC张力控制通用程序模板采用三菱伺服FX3U的速度与力矩模式,收料采用锥度与恒张力两种控制模式。程序包含(1)锥度计算详细步骤(2)模拟量输入输出(3)张力检测,有PID调节.(4)完整的电气图纸是锂电行业分切机通用程序模板。对于做三菱PLC(张力控制)朋友有很好的借鉴意义。所有......
  • Mitsubishi/三菱Q系列PLC项目案例模板 1 :三菱Q系列PLC。 采用D
    Mitsubishi/三菱Q系列PLC项目案例模板1:三菱Q系列PLC。采用DECO的步进模式,每次条件满足,程序自动进入下一步(初学人员可看看)2:QD75P定位模块实现三轴插补(XZY实现,比较复杂,要有一定基础才能看得懂)。3:QJ71E71-100以太网模块用于跟电脑通信。(比较复杂,要有一定基础才能看得懂)。4:......
  • Mitsubishi/三菱SFC顺控大型程序模板 1:三菱Q03UDE,500个IO点(5个输
    Mitsubishi/三菱SFC顺控大型程序模板1:三菱Q03UDE,500个IO点(5个输入模块、3个输出模块),带16轴伺服(由两个QD70P8控制)。2:超完美威纶触摸屏画面。3:全新的编程思维,即使是初学者也可以了解。4:做大型程序,完美的简化程序。5:适合没有做大型设备的工程师,对比较资深的工程师也有很大的......
  • #Mitsubishi /三菱口罩机程序信捷ethercat模板 1 程序高度模
    #Mitsubishi/三菱口罩机程序信捷ethercat模板1程序高度模块化,2plc采用xdh-60t4带ethercat总线控制伺服3触摸屏采用信捷屏4程序分功能编写,有以下部分a初始化b手动c故障复位d自动等等功能。可轻易拓展十几二十多个轴,,plc是目前性价比最高的方案,正弦曲......
  • Mitsubishi/三菱Q系列16轴设备 带个4个QD75运行模块,1个QJ71C24通信模块,1个QJ61BT11N
    Mitsubishi/三菱Q系列16轴设备带个4个QD75运行模块,1个QJ71C24通信模块,1个QJ61BT11N三菱CC-Link模块,多个输入输出模块。含三菱的触摸屏和CAD完整电气图.程序带详细完整的注释。包括:1运行流程控制;2完整的报警;3完善的伺服操作系统;4锁机密码;5生产报表程序;6通信程序。对做几年的电气......
  • k8s-mount中subpath的用法
    1.k8s中挂载的如果是pvc,那么挂载的应该是目录,在subpath处如果有填写,那subpath处是volume的子目录,也就是说把容器的mountpath的路径,映射到相应的volume里的path路径里,例如将mysql里的/var/lib/mysql映射到volume下的mysql目录,则subpath为mysql,如果是直接映射到volume只subpath空......