首页 > 其他分享 >【每日一题】LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目(数组、滑动窗口)

【每日一题】LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目(数组、滑动窗口)

时间:2024-08-31 16:22:24浏览次数:6  
标签:满足条件 arr 窗口 int 1343 数组 threshold LeetCode

【每日一题】LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目(数组、滑动窗口)


题目描述

给定一个整数数组 arr 和两个整数 kthreshold,要求找出数组中长度为 k 且平均值大于等于 threshold 的子数组的数量。

输入格式

  • arr: 一个整数数组。
  • 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]
  • 示例 2:

    • 输入: arr = [11,13,17,23,29,31,7,5,2,3], k = 3, threshold = 5
    • 输出: 6
    • 解释: 前 6 个长度为 3 的子数组平均值都大于 5。

限制

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

思路分析

这个问题可以通过滑动窗口的方法来解决。首先,我们初始化一个窗口,包含数组的前 k 个元素,计算这个窗口的和。如果这个和大于等于 k * threshold,则说明这个窗口满足条件。然后,我们开始滑动窗口,每次向右移动一个元素,移除窗口最左边的元素,添加一个新的元素到窗口的右边。每次移动后,我们更新窗口的和,并检查是否满足条件。这个过程一直持续到窗口滑过数组的末尾。

输入示例

  • arr = [2,2,2,2,5,5,5,8]
  • k = 3
  • threshold = 4

代码实现

class Solution {
    public int numOfSubarrays(int[] arr, int k, int threshold) {
        int n = arr.length; // 数组的长度
        int sum = 0, count = 0; // sum用于累计满足条件的子数组数量,count用于存储当前窗口的和

        // 初始化第一个窗口的和
        for (int i = 0; i < k; i++) {
            count += arr[i]; // 累加前k个元素的值
        }

        // 如果第一个窗口的和满足条件,增加计数
        if (count >= threshold * k) {
            sum++;
        }

        // 滑动窗口
        for (int i = k; i < n; i++) {
            count = count - arr[i - k] + arr[i]; // 移除窗口左侧的元素,加上右侧的元素
            if (count >= threshold * k) {
                sum++; // 如果当前窗口的和满足条件,增加计数
            }
        }

        return sum; // 返回满足条件的子数组数量
    }
}

标签:满足条件,arr,窗口,int,1343,数组,threshold,LeetCode
From: https://blog.csdn.net/Hanbuhuic/article/details/141753479

相关文章

  • PHP数组
    数组能够在单个变量中存储多个值数组可以在单个变量中存储多个值,并且您可以根据键访问其中的值。创建数组在PHP中,array()函数用于创建数组:在PHP中,有三种类型的数组:数值数组-带有数字ID键的数组关联数组-带有指定的键的数组,每个键关联一个值多维数组-包含一个......
  • js 数组的常用方法:在头部插入,删除,尾部插入,删除
    arr.push(value),在数组的末尾添加一个或多个元素,并返回数组的新长度。arr.pop()删除索引值最大的元素,即删除数组末尾的元素,并返回被删除的元素。unshift(value)在数组的头部添加一个或多个元素,并返回数组的新长度shift()删除索引为0的元素,并返回删除的元素splice()方法会修......
  • leetcode 3 无重复字符最长串
    leetcode3无重复字符最长串思路使用滑动窗口,建两个整型变量lp和rp,分别代表左边界指针和右边界指针,整型temp储存当前字串长度,整形max储存当前最长长度,然后从左往右遍历字符串。解题过程先将字符串toCharArray转成字符数组m,建一个哈希集合,储存当前已经用过的字符,然后写一......
  • 06.类-数组(array)和string
    6.类-数组(array)和string6.1数组数组是一组连续的内存位置,它们都具有相同的类型。为了指代数组中的特定位置或元素,我们指定数组的名称和特定元素在数组中的位置编号。数组名称遵循与其他变量名相同的约定。下标必须是整数或整数表达式,带下标的数组名是一个左值,它可以在赋值......
  • LeetCode题集-1- 两数之和
      这个题目是什么意思呢?简单来说就是在一个数组中找出两个元素,使其和为我们设定的值,并且每个元素只能用一次。 如下图具体示例: 到这里不知道你是否已经有解题思路了呢?解法一:双层循环我第一反应就是双层循环,直接暴力破解。因为题目要求每个元素只能使用一次,并且已经计......
  • LeetCode 热题 100 回顾
    目录一、哈希部分1.两数之和 (简单)2.字母异位词分组 (中等)3.最长连续序列 (中等)二、双指针部分4.移动零 (简单)5.盛最多水的容器 (中等)6. 三数之和 (中等)7.接雨水 (困难)三、滑动窗口8.无重复字符的最长子串 (中等)9.找到字符串中所有字母异位词 (中等)四、子串10.......
  • 738. 单调递增的数字(leetcode)
    https://leetcode.cn/problems/monotone-increasing-digits/description/classSolution{publicintmonotoneIncreasingDigits(intn){//返回单调递增的最大数字//思路比较巧妙的贪心题,需要仔细考虑两个相邻位之间的比较//一旦发现有前一......
  • 用c++以数组的形式实现栈的数据结构
    #include<iostream>usingnamespacestd;//设置数组的最大值#define MaxSize100intA[MaxSize];//栈顶inttop=-1;//入栈voidpush(intx){  //处理溢出的情况  if(top==MaxSize-1){    cout<<"stackoverflow"<<endl;    return; ......
  • Leetcode 第 408 场周赛题解
    Leetcode第408场周赛题解Leetcode第408场周赛题解题目1:3232.判断是否可以赢得数字游戏思路代码复杂度分析题目2:3233.统计不是特殊数字的数字数量思路代码复杂度分析题目3:3234.统计1显著的字符串的数量思路代码复杂度分析题目4:3235.判断矩形的两个角落是否......
  • 数据结构与算法 第四天(串、数组、广义表)
    串(String)任意字符组成的有限序列串的类型定义串的顺序存储结构模式匹配算法确定主串所含字串第一次出现的位置。BF算法穷举法,从每个字符开始依次匹配KMP算法链式存储数组基本操作特殊矩阵存储对称矩阵三角矩阵对角矩阵稀疏矩阵超过95%元素为零......