当前位置: 首页 > article >正文

LeetCode 2537.统计好子数组的数目:滑动窗口(双指针)

【LetMeFly】2537.统计好子数组的数目:滑动窗口(双指针)

力扣题目链接:https://leetcode.cn/problems/count-the-number-of-good-subarrays/

给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中  子数组的数目。

一个子数组 arr 如果有 至少 k 对下标 (i, j) 满足 i < j 且 arr[i] == arr[j] ,那么称它是一个  子数组。

子数组 是原数组中一段连续 非空 的元素序列。

 

示例 1:

输入:nums = [1,1,1,1,1], k = 10
输出:1
解释:唯一的好子数组是这个数组本身。

示例 2:

输入:nums = [3,1,4,3,2,2,4], k = 2
输出:4
解释:总共有 4 个不同的好子数组:
- [3,1,4,3,2,2] 有 2 对。
- [3,1,4,3,2,2,4] 有 3 对。
- [1,4,3,2,2,4] 有 2 对。
- [4,3,2,2,4] 有 2 对。

 

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i], k <= 109

解题方法:滑动窗口(双指针)

解题思路

使用一个哈希表记录窗口(两个指针之间)中每个元素出现的次数。

右指针从第一个元素到最后一个元素遍历数组,在移动的过程中,将指向的元素添加到“窗口”中并更新窗口中的“相等对数”;

在窗口中的“相等对数”大于等于 k k k时,不断右移左指针(将左指针指向元素移出窗口)并更新窗口中的“相等对数”;

这样,右指针每次移动一个位置,左指针指向的就是第一个“窗口中相等对数小于 k k k”的位置。

具体方法

假设右移指针新加入窗口中了一个元素 x x x,那么如何更新“窗口中的相等对数”呢?

新加入 x x x与之前窗口中的每个已有 x x x都能配对,所以新增“对数”为新元素加入前哈希表中 x x x的个数。

假设右移指针新移除了窗口中一个元素 x x x,那么如何更新“窗口中的相等对数”呢?

被移除 x x x与窗口中的每个其他 x x x都配过对,所以减少的“对数”为新元素移除后哈希表中 x x x的个数。

假设第一个“使窗口中相等对数小于 k k k”的左指针下标为 l l l,那么答案应该增加几?

l l l下标左边的任何一个元素开始,到右指针 r r r的字数组都满足“相等对数大于等于 k k k”,都是“好字数组”。

r r r结尾的好字数组的个数为 l l l左边的元素个数,对答案的贡献为 l l l

时空复杂度

  • 时间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))。左右指针最多各自遍历数组一次
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-04-16 19:45:53* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-16 20:25:23*/
typedef long long ll;class Solution {
public:ll countGood(vector<int>& nums, int k) {ll ans = 0;unordered_map<int, int> ma;ll now = 0;for (int l = 0, r = 0; r < nums.size(); r++) {now += ma[nums[r]]++;while (now >= k) {now -= --ma[nums[l++]];}ans += l;}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-04-16 20:23:21
LastEditors: LetMeFly.xyz
LastEditTime: 2025-04-16 20:26:37
'''
from typing import List
from collections import defaultdictclass Solution:def countGood(self, nums: List[int], k: int) -> int:times = defaultdict(int)ans = l = now = 0for t in nums:now += times[t]times[t] += 1while now >= k:times[nums[l]] -= 1now -= times[nums[l]]l += 1ans += lreturn ans
Java
/** @Author: LetMeFly* @Date: 2025-04-16 20:27:13* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-16 20:49:27*/
import java.util.Map;
import java.util.HashMap;class Solution {public long countGood(int[] nums, int k) {long ans = 0, now = 0;Map<Integer, Integer> ma = new HashMap<>();for (int l = 0, r = 0; r < nums.length; r++) {now += ma.merge(nums[r], 1, Integer::sum) - 1;while (now >= k) {now -= ma.merge(nums[l++], -1, Integer::sum);}ans += l;}return ans;}
}
Go
/** @Author: LetMeFly* @Date: 2025-04-16 20:50:11* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-04-16 20:56:36*/
package mainfunc countGood(nums []int, k int) (ans int64) {times := map[int]int64{}now := int64(0)for l, r := 0, 0; r < len(nums); r++ {now += times[nums[r]]times[nums[r]]++for now >= int64(k) {times[nums[l]]--now -= times[nums[l]]l++}ans += int64(l)}return
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关文章:

LeetCode 2537.统计好子数组的数目:滑动窗口(双指针)

【LetMeFly】2537.统计好子数组的数目&#xff1a;滑动窗口(双指针) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-good-subarrays/ 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果…...

矩阵基础+矩阵转置+矩阵乘法+行列式与逆矩阵

GPU渲染过程 矩阵 什么是矩阵&#xff08;Matrix&#xff09; 向量 &#xff08;3&#xff0c;9&#xff0c;88&#xff09; 点乘&#xff1a;计算向量夹角 叉乘&#xff1a;计算两个向量构成平面的法向量。 矩阵 矩阵有3行&#xff0c;2列&#xff0c;所以表示为M32 获取固…...

(EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 EtherCAT 转 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 协议转换网关&#xff0c;为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案&#xff0c;可以轻松容易将 EtherNet/IP 网络接入 EtherCAT 网络中&#xff0c;方便…...

分享:批量提取图片文字并自动命名文件,ocr识别图片指定区域并重命名文件名工具,基于WPF和腾讯OCR识别的接口的视线方案

一、项目背景 在处理大量图片时,常常需要从图片中提取特定区域的文字信息,并依据这些信息对图片进行重命名。例如,在档案管理领域,大量纸质文件被扫描成图片后,需要从图片中提取关键信息(如文件编号、日期等)来重命名图片,以便后续的检索和管理;在电商领域,商家可能…...

Mysql读写分离(1)-服务器的设置(主从复制)

1.简介 随着网站访问和请求量的增加&#xff0c;单台数据库服务器的连接已耗尽&#xff0c;会出现连接请求还在等待&#xff0c;或是数据库服务器崩溃等现象&#xff0c;这时候我们考虑如何减少数据库的连接&#xff0c;可以通过优化代码、使用缓存、数据库读写分离等方式解决…...

STM32F103ZET6移植FATFS文件系统教程(W25Q32)

一、FATFS核心特性 跨平台支持‌ 支持FAT12/FAT16/FAT32格式&#xff0c;兼容Windows文件系统‌&#xff1b; 采用标准C语言编写&#xff0c;代码量小且支持RTOS‌。 配置灵活性‌ 通过宏定义实现功能裁剪&#xff0c;例如&#xff1a; FF_FS_READONLY&#xff1a;设为1时禁…...

STM32 模块化开发实战指南:系列介绍

本文是《STM32 模块化开发实战指南》系列的导读篇,旨在介绍整个系列的写作目的、适用读者、技术路径和每一篇的主题规划。适合从事 STM32、裸机或 RTOS 嵌入式开发的个人开发者、初创工程师或企业项目团队。 为什么要写这个系列? 在嵌入式开发中,很多人刚开始都是从点亮一个…...

AF3 create_alignment_db_sharded脚本create_shard函数解读

AlphaFold3 create_alignment_db_sharded 脚本在源代码的scripts/alignment_db_scripts文件夹下。 该脚本中的 create_shard 函数的功能是将一部分链&#xff08;shard_files&#xff09;中的所有对齐文件写入一个 .db 文件&#xff0c;并返回这些链的索引信息&#xff08;字节…...

【Python语言基础】21、Python标准库

文章目录 1. 标准库1.1 标准库构成及特点1.2 常见分类和模块1.3 标准库使用 1. 标准库 Python 标准库就像是 Python 自带的 “百宝箱”&#xff0c;里面装了各种各样已经写好的工具&#xff0c;你在编程的时候可以直接拿来用&#xff0c;不用自己再费劲去编写。 什么是标准库 …...

数据库脱裤

假设你已经getshell 找到mysql账号密码。 网站要连接mysql&#xff0c;就需要把mysql的账号密码保存在一个php文件中&#xff0c;类似config.php、common.inc.php等&#xff0c;在shell中&#xff0c;读取这些文件&#xff0c;找到其中信息即可 下面是一些常见平台的配置文…...

信刻电子档案蓝光光盘刻录安全检测长期归档

信刻一直致力于为档案馆、各行业档案部门&#xff0c;提供跨网数据交换、电子档案数据磁光异质备份归档解决方案。所研制的电子档案光盘智能长期归档系统&#xff0c;满足国产环境下”刻、管、存、检、用”全生命周期管理应用需求&#xff0c;能够提供一份离线归档、一份近线存…...

vue3中,element-plus中el-input的v-model和value的用法示例

el-input的v-model&#xff0c;邦定响应式变量 <el-col :span"6"><el-form-item label"检验类别" prop"verifyType"><el-input v-model"applyAllInfo.applyBasicInfo.verifyTypeName" readonly /></el-form-item…...

文章记单词 | 第33篇(六级)

一&#xff0c;单词释义 poison [ˈpɔɪzn] n. 毒药&#xff1b;毒物&#xff1b;有害的思想&#xff08;或心情等&#xff09;&#xff1b;vt. 毒死&#xff1b;毒害&#xff1b;下毒&#xff1b;在… 中放毒&#xff1b;污染&#xff1b;adj. 有毒的justification [ˌdʒʌ…...

深度学习算法:从基础到实践

简介 深度学习作为人工智能领域的一个重要分支&#xff0c;近年来在多个领域取得了显著的成就。本文将从基础概念出发&#xff0c;探讨深度学习算法的核心原理&#xff0c;并介绍一些实际应用案例。 深度学习算法的核心概念 深度学习算法基于人工神经网络&#xff0c;通过构…...

L2-052 吉利矩阵分

L2-052 吉利矩阵 - 团体程序设计天梯赛-练习集 所有元素为非负整数&#xff0c;且各行各列的元素和都等于 7 的 33 方阵称为“吉利矩阵”&#xff0c;因为这样的矩阵一共有 666 种。 本题就请你统计一下&#xff0c;把 7 换成任何一个 [2,9] 区间内的正整数 L&#xff0c;把矩…...

计算机网络中各种物理量的单位总结

在计算机网络中&#xff0c;数据速率的单位容易混淆&#xff0c;以下是清晰总结&#xff1a; 一、基本单位区分 比特&#xff08;bit&#xff09;与字节&#xff08;Byte&#xff09; 小写 b 表示 比特&#xff08;bit&#xff09;&#xff0c;是数据传输的基本单位。 大写 B…...

Solidity私有函数和私有变量区别,私有变量可以被访问吗

web3面试题 私有函数和私有变量区别&#xff0c;私有变量可以被访问吗 ChatGPT said: 在 Web3 开发&#xff0c;尤其是使用 Solidity 编写智能合约时&#xff0c;关于私有函数和私有变量的区别是常见的面试题。下面是详细解析&#xff1a; ✅ 私有函数&#xff08;Private Fu…...

解决JSON格式数据大小写问题,以及@JsonProperty 和@JSONField序列化的区别

1、JsonProperty注解方式 JsonProperty注解是annotation包下的一个注解&#xff0c;可以通过value属性定义注解修饰的属性名称&#xff0c;如果你用的是JsonProperty注解&#xff0c;那么你千万不要用JSONObject.toJSONString(实体)去转json&#xff0c;可能很多人在这里就蒙蔽…...

Python正则表达式有哪些常用匹配字符?

处理文本数据时&#xff0c;我们经常需要查找、提取或替换特定模式的字符串。这时候正则表达式就成了程序员最强大的武器之一。今天我们就来详细聊聊Python中那些最常用的正则表达式字符和它们的实际用法。 为什么要学正则表达式&#xff1f; 假设你遇到这些场景&#xff1a;…...

List、Set集合通过Stream流求和

目录 一、泛型为Integer、Long、Double、BigDecimal求和 二、泛型为实体类 对单个属性求和 对多个属性分别分组求和 并返回聚合后的对象 多字段乘积求和&#xff08;基本数据类型&#xff09; 多字段乘积求和&#xff08;BigDecimal&#xff09; 对对象中的多个字段求和…...

Linux:Makefile

编译器gcc 使用方式&#xff1a;gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ] 编译分为以下几个步骤&#xff1a; 1.预处理(进⾏宏替换) 预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。 预处理指令是以#号开头的代码⾏。 实例: gcc –E hello.c –o hello…...

基于双闭环PID控制器的永磁同步电机控制系统匝间故障Simulink仿真

欢迎微♥关注“电击小子程高兴的MATLAB小屋”获取巨额优惠 1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2013Rb&#xff09;软件。建议采用matlab2013 Rb及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff0c;高于该版本的matlab均可正…...

硬件电路设计之51单片机(2)

声明&#xff1a;绘制原理图和PCB的软件为嘉立创EDA。根据B站尚硅谷嵌入式之原理图&PCB设计教程学习所作个人用笔记。 目录 一、原理图详解 1、TypeC接口 &#xff08;1&#xff09;TypeC接口介绍 &#xff08;2&#xff09;TypeC原理图 2、5V转3.3V 3、单片机电源开…...

从零开始学习PX4源码20(遥控器模式切换如何执行)

目录 文章目录 目录摘要1.用到的消息和主题2.遥控器切换模式代码流程摘要 本节主要学习PX4的手动遥控器切换模式,具体是如何实现的,具体改变了哪些变量,和模式管理有什么联系。 1.用到的消息和主题 1.行为请求消息:ActionRequest.msg ///时间信息 uint64 timestamp # t…...

SpringAI+DeepSeek大模型应用开发——1 AI概述

AI领域常用词汇 LLM&#xff08;LargeLanguage Model&#xff0c;大语言模型&#xff09; 能理解和生成自然语言的巨型AI模型&#xff0c;通过海量文本训练。例子&#xff1a;GPT-4、Claude、DeepSeek、文心一言、通义干问。 G&#xff08;Generative&#xff09;生成式: 根据上…...

经济指标学习(一)

系列文章目录 文章目录 系列文章目录1、市净率**一、定义与计算****二、核心意义****三、应用场景****四、局限性****五、分类与衍生指标****总结** 2、市销率**一、定义与计算****二、核心意义****三、优缺点分析****四、适用场景****五、与其他指标的对比****六、实际应用案例…...

理解 results = model(source, stream=True) 的工作原理和优势

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;当处理视频或图像序列时&#xff0c;streamTrue 会将结果包装成一个 生成器&#xff08;Generator&#xff09;&#xff0c;逐帧生成 Results 对象&#xff0c;而不是一次性返回所有结果。内存优化&#xff1a;…...

国内互联网大厂推出的分布式数据库 的详细对比,涵盖架构、性能、适用场景、核心技术等维度

以下是 国内互联网大厂推出的分布式数据库 的详细对比&#xff0c;涵盖架构、性能、适用场景、核心技术等维度&#xff1a; 一、主流分布式数据库列表 大厂数据库名称类型适用场景发布时间腾讯云TDSQL分布式HTAP金融、电商、游戏、政企2010年阿里云OceanBase分布式HTAP银行核…...

解释`new`关键字的执行过程,并手动实现一个`myNew`函数。

在 JavaScript 中&#xff0c;new 关键字用于创建一个用户定义的对象实例。它的执行过程分为以下步骤&#xff1a; new 关键字的执行过程 创建空对象&#xff1a; 创建一个新的空对象&#xff0c;其 [[Prototype]]&#xff08;即 __proto__&#xff09;指向构造函数的 prototy…...

Android 项目配置文件解释

Android 项目配置文件解释 目录 Android 项目配置文件解释1. `plugins` 块2. `android` 块3. `dependencies` 块为什么需要 JDK 和 Kotlin1. plugins 块 plugins {id com.android.applicationid org.jetbrains.kotlin.android }id com.android.application:应用 Android 应用…...