【算法】滑动窗口题单——4.不定长滑动窗口(求子数组个数)

文章目录

  • 前言
  • 2799. 统计完全子数组的数目
    • 解法1——枚举右端点,移动左端点
    • 解法2——枚举左端点,扩展右端点
  • 713. 乘积小于 K 的子数组
  • 1358. 包含所有三种字符的子字符串数目
  • 2302. 统计得分小于 K 的子数组数目
  • 2537. 统计好子数组的数目
  • 2762. 不间断子数组(滑动窗口+)
    • 解法1——TreeMap
    • 解法2——单调队列

题单来源:https://leetcode.cn/problems/minimum-size-subarray-in-infinite-array/solutions/2464878/hua-dong-chuang-kou-on-shi-jian-o1-kong-cqawc/

前言

这些问题常用的方法有:

  1. 枚举左端点,扩展右端点。
  2. 枚举右端点,收缩左端点。

2799. 统计完全子数组的数目

https://leetcode.cn/problems/count-complete-subarrays-in-an-array/description/

在这里插入图片描述

提示:

1 <= nums.length <= 1000
1 <= nums[i] <= 2000

解法1——枚举右端点,移动左端点

class Solution {public int countCompleteSubarrays(int[] nums) {Set<Integer> s = new HashSet();for (int num: nums) s.add(num);int n = nums.length, sum = s.size(), ans = 0;Map<Integer, Integer> m = new HashMap();for (int r = 0, l = 0; r < n; ++r) {m.merge(nums[r], 1, Integer::sum);while (m.get(nums[l]) > 1) {m.merge(nums[l], -1, Integer::sum);l++;}if (m.size() == sum) ans += l + 1;}return ans;}
}

解法2——枚举左端点,扩展右端点

class Solution {public int countCompleteSubarrays(int[] nums) {Set<Integer> set = new HashSet<>();Map<Integer, Integer> map = new HashMap<>();for (int num: nums) set.add(num);int x = set.size(), n = nums.length, ans = 0;for (int l = 0, r = 0; l < n; ++l) {while (r < n && map.size() < x) map.merge(nums[r++], 1, Integer::sum);if (map.size() == x) ans += n - r + 1;map.merge(nums[l], -1, Integer::sum);if (map.get(nums[l]) == 0) map.remove(nums[l]);}return ans;}
}

713. 乘积小于 K 的子数组

https://leetcode.cn/problems/subarray-product-less-than-k/description/

在这里插入图片描述

提示:

1 <= nums.length <= 3 * 10^4
1 <= nums[i] <= 1000
0 <= k <= 10^6

枚举右端点,根据窗口内的乘积大小移动左端点。
[ l , r ] [l,r] [l,r]范围内的乘积符合条件时,一共有r-l+1个子数组符合条件计入答案,分别为 [ l + 1 , r ] , [ l + 2 , r ] , . . . , [ r , r ] [l+1,r],[l+2,r],...,[r,r] [l+1,r],[l+2,r],...,[r,r]

class Solution {public int numSubarrayProductLessThanK(int[] nums, int k) {int n = nums.length, mul = 1, ans = 0;for (int l = 0, r = 0; r < n; ++r) {mul *= nums[r];while (l <= r && mul >= k) mul /= nums[l++];ans += r - l + 1;}return ans;}
}

1358. 包含所有三种字符的子字符串数目

https://leetcode.cn/problems/number-of-substrings-containing-all-three-characters/description/

在这里插入图片描述

提示:
3 <= s.length <= 5 x 10^4
s 只包含字符 a,b 和 c ·

使用 c n t [ ] cnt[] cnt[] 数组维护窗口中各个字母的数量。
枚举左端点,拓展右端点,当 [ l , r ] [l,r] [l,r]符合条件时,所有的 [ l , r ] , [ l , r + 1 ] , . . . [ l , n − 1 ] [l,r],[l,r+1],...[l,n-1] [l,r],[l,r+1],...[l,n1]都符合条件,计入答案。

class Solution {public int numberOfSubstrings(String s) {int[] cnt = new int[3];int ans = 0, n = s.length();for (int l = 0, r = 0; l < n; ++l) {while (r < n && !check(cnt)) cnt[s.charAt(r++) - 'a']++;if (check(cnt)) ans += n - r + 1;else break;         // 已经不可能有答案了cnt[s.charAt(l) - 'a']--;}return ans;}public boolean check(int[] cnt) {return cnt[0] != 0 && cnt[1] != 0 && cnt[2] != 0;}
}

2302. 统计得分小于 K 的子数组数目

https://leetcode.cn/problems/count-subarrays-with-score-less-than-k/description/

在这里插入图片描述

提示:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5
1 <= k <= 10^15

枚举右端点,根据窗口情况移动左端点。
当窗口 [ l , r ] [l,r] [l,r]满足条件时,所有 [ l + 1 , r ] , [ l + 2 , r ] , . . . , [ r , r ] [l+1,r],[l+2,r],...,[r,r] [l+1,r],[l+2,r],...,[r,r]都满足条件。

class Solution {public long countSubarrays(int[] nums, long k) {long ans = 0, s = 0;for (int l = 0, r = 0; r < nums.length; ++r) {s += nums[r];while (s * (r - l + 1) >= k) s -= nums[l++];ans += r - l + 1;}return ans;}
}

2537. 统计好子数组的数目

https://leetcode.cn/problems/count-the-number-of-good-subarrays/description/

在这里插入图片描述

提示:

1 <= nums.length <= 10^5
1 <= nums[i], k <= 10^9

哈希表记录各个元素出现的数量,cnt记录符合条件的下标对数。

枚举窗口的左端点,为了让窗口符合条件扩展右端点。(符合条件之后,所有比当前右端点更靠右的下标作为右端点一定也符合条件。)

class Solution {public long countGood(int[] nums, int k) {long ans = 0;Map<Integer, Integer> m = new HashMap<>();int n = nums.length, cnt = 0;   // cnt记录下标对数// 枚举左端点,扩展右端点for (int l = 0, r = 0; l < n; ++l) {while (r < n && cnt < k) {m.merge(nums[r], 1, Integer::sum);cnt += m.get(nums[r]) - 1;r++;}if (cnt >= k) ans += n - r + 1;else break;m.merge(nums[l], -1, Integer::sum);cnt -= m.get(nums[l]);}return ans;}
}

2762. 不间断子数组(滑动窗口+)

https://leetcode.cn/problems/continuous-subarrays/description/

在这里插入图片描述

提示:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9

使用滑动窗口,维护窗口内的最大值和最小值有多种方法。

解法1——TreeMap

TreeMap 会对 key 自动排序,并且有方便的 api 获取最大key和最小key。

class Solution {public long continuousSubarrays(int[] nums) {long ans = 0;int n = nums.length;TreeMap<Integer, Integer> s = new TreeMap<>();for (int l = 0, r = 0; r < n; ++r) {s.merge(nums[r], 1, Integer::sum);while (s.lastKey() - s.firstKey() > 2) {s.merge(nums[l], -1, Integer::sum);if (s.get(nums[l]) == 0) s.remove(nums[l]);l++;}ans += r - l + 1;}return ans;}
}

解法2——单调队列

两个单调队列分别维护窗口中的最大值和最小值

class Solution {public long continuousSubarrays(int[] nums) {long ans = 0;// dq1从大到小,dq2从小到大Deque<Integer> dq1 = new ArrayDeque(), dq2 = new ArrayDeque();for (int i = 0, j = 0; i < nums.length; ++i) {// 处理两个单调队列while (!dq1.isEmpty() && nums[i] > nums[dq1.peekLast()]) dq1.pollLast();while (!dq2.isEmpty() && nums[i] < nums[dq2.peekLast()]) dq2.pollLast();dq1.offerLast(i);dq2.offerLast(i);while (nums[dq1.peekFirst()] > nums[dq2.peekFirst()] + 2) {if (dq1.peekFirst() < dq2.peekFirst()) {j = dq1.peekFirst() + 1;dq1.pollFirst();}else {j = dq2.peekFirst() + 1;dq2.pollFirst();}}ans += i - j + 1;}return ans;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171597.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<蓝桥杯软件赛>零基础备赛20周--第2周

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

假脱机技术(SPOOLing技术)

文章目录 1.什么是脱机技术1.脱机技术解决的问题 2.假脱机技术的实现原理1.输入井和输出井2.输入进程和输出进程3,输入缓冲区和输出缓冲区 3.共享打印机的原理分析1.把独占式的打印机改造成共享设备 1.什么是脱机技术 脱机&#xff1a;脱离主机的控制进行的输入输出操作。 批处…

在声明和定义的一些小坑

1、静态成员变量的初始化 静态成员变量声明在 .h 头文件文件中&#xff0c;初始化应该在 .cpp 源文件中 就会出现"找到一个或多个多重定义的符号",下面的错误 class MyString{public:typedef char* iterator;typedef const char* const_iterator;iterator begin();…

QGIS008:QGIS拓扑检查、修改及验证

摘要&#xff1a;本文介绍使用QGIS拓扑检查器和几何图形检查器检查图层的拓扑错误&#xff0c;修改拓扑错误&#xff0c;并对修改后的图层进行错误验证。 实验数据&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Vy2s-KYS-XJevqHNdavv9A?pwdf06o 提取码&#xff1a…

C#,数值计算——分类与推理,基座向量机高斯核(Svmgausskernel)的计算方法与源程序

No logical, not an AI. 你现在能阅读到的大量AI都是假AI&#xff0c;包括 。。。GPT 在内&#xff0c;没有任何鸟用。凡为 ...GPT 发声者均为假学者。 No log, no AI. 1 文本格式 using System; namespace Legalsoft.Truffer { public class Svmgausskernel : Svmgen…

适用于 Windows 10 和 Windows 11 设备的笔记本电脑管理软件

便携式计算机管理软件使 IT 管理员能够简化企业中使用的便携式计算机的部署和管理&#xff0c;当今大多数员工使用Windows 笔记本电脑作为他们的主要工作机器&#xff0c;他们确实已成为几乎每个组织不可或缺的一部分。由于与台式机相比&#xff0c;笔记本电脑足够便携&#xf…

文心一言简单体验

百度正式发布文心一言&#xff0c;文心一言 这里的插件模式挺有意思&#xff1a; 测试了一下图解说明&#xff0c;随意上传了一张图片&#xff1a; 提供图解让反过来画&#xff0c;抓住了部分重点&#xff0c;但是还是和原图有比较大的差异&#xff01; 百宝箱 暂未逐个体验&am…

第八节——Vue渲染列表+key作用

一、列表渲染 vue中使用v-for指令进行列表 <template><div><!-- item 代表 当前循环的每一项 --><!-- index 代表 当前循环的下标--><!-- 注意&#xff1a;必须要加key--><div v-for"(item, index) in arr" :key"index"…

【Flutter】自定义分段选择器Slider

【Flutter】ZFJ自定义分段选择器Slider 前言 在开发一个APP的时候&#xff0c;需要用到一个分段选择器&#xff0c;系统的不满足就自己自定义了一个&#xff1b; 可以自定义节点的数量、自定义节点的大小、自定义滑竿的粗细&#xff0c;自定义气泡的有无等等… 基本上满足你…

蓝桥杯第 2 场算法双周赛 第2题 铺地板【算法赛】c++ 数学思维

题目 铺地板https://www.lanqiao.cn/problems/5887/learning/?contest_id145 问题描述 小蓝家要装修了&#xff0c;小蓝爸爸买来了很多块&#xff08;你可以理解为数量无限&#xff09;2323 规格的地砖&#xff0c;小蓝家的地板是 nm 规格的&#xff0c;小蓝想问你&#xf…

C# OpenCvSharp Yolov8 Face Landmarks 人脸特征检测

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Yolov8_Demo {public partial class frmMain…

【Qt】文件系统

文章目录 文件系统文件操作案例&#xff1a;显示路径到标题框&#xff0c;显示内容到文本框对文件进行写操作获取文件相关信息 文件系统 Qt 通过QIODevice提供了对 I/O 设备的抽象&#xff0c;这些设备具有读写字节块的能力&#xff0c;下面是 I/O 设备的类图&#xff1a; QIO…

Unity3D 如何用unity引擎然后用c#语言搭建自己的服务器

Unity3D是一款强大的游戏开发引擎&#xff0c;可以用于创建各种类型的游戏。在游戏开发过程中&#xff0c;经常需要与服务器进行通信来实现一些功能&#xff0c;比如保存和加载游戏数据、实现多人游戏等。本文将介绍如何使用Unity引擎和C#语言搭建自己的服务器&#xff0c;并给…

linux中好玩的数据流定向和管道命令一

知识点复习&#xff1a; 什么是数据流定向&#xff0c;个人理解就是将 一些结果信息不打印在屏幕上&#xff0c;而是定位在某一个文件里面 ll /wdf > file 会覆盖file的原内容 ll /wdf >> 会追加到原文件后面 比如在自己的目录新建1.TXT&#xff0c; 2.txt ll /…

利用a标签锚点定位实现切换页面的部分内容

最近在做一个数据可视化大屏的作业&#xff0c;其中需要实现点击不同的按钮&#xff0c;大屏中间内容呈现不同的数据分析图表&#xff0c;页面其他部分不发生改变。之前考虑过复制多个页面然后改变中间的页面&#xff0c;但是这样会导致文件冗余&#xff0c;而且由于静态文件放…

LIS系统-实现检验报告集中管理

LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff0c;使医生能够通过医生工作站方便、及时地…

Android S从桌面点击图标启动APP流程 (五)

系列文章 Android S从桌面点击图标启动APP流程 (一)Android S从桌面点击图标启动APP流程 (二) Android S从桌面点击图标启动APP流程 (三) Android S从桌面点击图标启动APP流程 (四) Android S从桌面点击图标启动APP流程 (五) Android S从桌面点击图标启动APP流程 (六) An…

Unable to find GatewayFilterFactory with name TokenRelay

目录 问题分析解决方案参考文档开源项目微服务商城项目前后端分离项目 问题分析 Spring Cloud Gateway 网关作为代理资源服务器&#xff0c;需要将 JWT 传递给下游资源服务器&#xff0c;下面是网关的配置 spring:cloud:gateway:discovery:locator:enabled: true # 启用服务发…

应用案例|基于高精度三维机器视觉引导机器人自动分拣包裹的应用

Part.1 行业背景 近年来&#xff0c;电商高速发展&#xff0c;百万件日订单处理的超大型分拣中心模式日益普及&#xff0c;传统的人工供包模式效率低&#xff0c;难以满足高超大分拣中心对分拣包裹的需求。随着科技的进步&#xff0c;自动供包系统进入大众视野&#xff0c;成为…

Flutter extended_image库设置内存缓存区大小与缓存图片数

ExtendedImage ExtendedImage 是一个Flutter库&#xff0c;用于提供高级图片加载和显示功能。这个库使用了 image 包来进行图片的加载和缓存。如果你想修改缓存大小&#xff0c;你可以通过修改ImageCache的配置来实现。 1. 获取ImageCache实例: 你可以通过PaintingBinding…