【算法】滑动窗口题单——5.多指针滑动窗口醒醒⭐

文章目录

  • 930. 和相同的二元子数组
    • 解法1——前缀和 + 哈希表
    • 解法2——滑动窗口 ⭐
  • 1248. 统计「优美子数组」
  • 1712. 将数组分成三个子数组的方案数⭐⭐⭐
  • 2444. 统计定界子数组的数目
    • 解法——多指针滑动窗口
    • 代码2——简洁写法:一次遍历+O(1) 空间🐂⭐
  • 992. K 个不同整数的子数组

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

930. 和相同的二元子数组

https://leetcode.cn/problems/binary-subarrays-with-sum/description/

在这里插入图片描述

提示:

1 <= nums.length <= 3 * 10^4
nums[i] 不是 0 就是 1
0 <= goal <= nums.length

解法1——前缀和 + 哈希表

类似两数之和的思想。

class Solution {public int numSubarraysWithSum(int[] nums, int goal) {int n = nums.length;int[] s = new int[n + 1];for (int i = 0; i < n; ++i) {s[i + 1] = s[i] + nums[i];}int ans = 0;Map<Integer, Integer> cnt = new HashMap<>();cnt.put(0, 1);for (int i = 0; i < n; ++i) {int v = s[i + 1] - goal;ans += cnt.getOrDefault(v, 0);cnt.merge(s[i + 1], 1, Integer::sum);}return ans;}
}

解法2——滑动窗口 ⭐

在这里插入图片描述

class Solution {public int numSubarraysWithSum(int[] nums, int goal) {int n = nums.length, ans = 0, s1 = 0, s2 = 0;for (int l1 = 0, l2 = 0, r = 0; r < n; ++r) {s1 += nums[r];s2 += nums[r];// l1~r之和<=goalwhile (l1 <= r && s1 > goal) s1 -= nums[l1++];// l2~r之和<goalwhile (l2 <= r && s2 >= goal) s2 -= nums[l2++];ans += l2 - l1;     // 相减即为=goal的范围}return ans;}
}

1248. 统计「优美子数组」

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

在这里插入图片描述

提示:

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

class Solution {public int numberOfSubarrays(int[] nums, int k) {int n = nums.length;int s1 = 0, s2 = 0, ans = 0;for (int l1 = 0, l2 = 0, r = 0; r < n; ++r) {if (nums[r] % 2 == 1) {s1++;s2++;}while (s1 > k) s1 -= nums[l1++] % 2;while (s2 >= k) s2 -= nums[l2++] % 2;ans += l2 - l1;}return ans;}
}

1712. 将数组分成三个子数组的方案数⭐⭐⭐

https://leetcode.cn/problems/ways-to-split-array-into-three-subarrays/description/

在这里插入图片描述

提示:
3 <= nums.length <= 10^5
0 <= nums[i] <= 10^4

枚举 i,0~i 作为第一个数组。
另外两个指针 j 和 k,对应第二个数组的结尾,分别是第二个数组右端点的可行范围两边。
当第二个数组不够大时,右移 j;当第二个数组还可以更大且不超过第三个数组时,右移 k。

class Solution {public int waysToSplit(int[] nums) {int n = nums.length;long[] s = new long[n + 1];for (int i = 0; i < n; ++i) {s[i + 1] = s[i] + nums[i];}final long MOD = (long)1e9 + 7;long ans = 0;// 0~i是第一个,i+1~j/k是第二个for (int i = 0, j = 1, k = 1; i < n - 2 && 3 * s[i + 1] <= s[n]; ++i) {j = Math.max(j, i + 1);while (j < n - 1 && s[j + 1] - s[i + 1] < s[i + 1]) j++;    // 不够大,右移while (k < n - 1 && s[n] - s[k + 1] >= s[k + 1] - s[i + 1]) k++;    // 还能更大,右移// 可取的范围是j~k-1ans = (ans + k - j) % MOD;}return (int)ans;}
}

2444. 统计定界子数组的数目

https://leetcode.cn/problems/count-subarrays-with-fixed-bounds/description/
在这里插入图片描述

提示:

2 <= nums.length <= 10^5
1 <= nums[i], minK, maxK <= 10^6

解法——多指针滑动窗口

使用两个 TreeMap 分别维护两个窗口中的最大值和最小值。
一个保证窗口中有 minK 和 maxK,另一个保证窗口中没有更大或更小的数字了。

class Solution {public long countSubarrays(int[] nums, int minK, int maxK) {int n = nums.length;TreeMap<Integer, Integer> tm1 = new TreeMap<>(), tm2 = new TreeMap<>();long ans = 0;for (int l1 = 0, l2 = 0, r = 0; r < n; ++r) {tm1.merge(nums[r], 1, Integer::sum);tm2.merge(nums[r], 1, Integer::sum);// l1确保没有更大或者更小的数字while (l1 <= r && (tm1.firstKey() < minK || tm1.lastKey() > maxK)) {tm1.merge(nums[l1], -1, Integer::sum);if (tm1.get(nums[l1]) == 0) tm1.remove(nums[l1]);l1++;}// l2确保有最小值和最大值while (l2 <= r && (tm2.firstKey() <= minK && tm2.lastKey() >= maxK)) {if (!((nums[l2] == minK || nums[l2] == maxK) && tm2.get(nums[l2]) == 0)) {tm2.merge(nums[l2], -1, Integer::sum);if (tm2.get(nums[l2]) == 0) tm2.remove(nums[l2]);l2++;}}ans += Math.max(0, l2 - l1);}return ans;}
}

代码2——简洁写法:一次遍历+O(1) 空间🐂⭐

https://leetcode.cn/problems/count-subarrays-with-fixed-bounds/solutions/1895713/jian-ji-xie-fa-pythonjavacgo-by-endlessc-gag2/

在这里插入图片描述

class Solution {public long countSubarrays(int[] nums, int minK, int maxK) {long ans = 0;int minI = -1, maxI = -1, i0 = -1;for (int i = 0; i < nums.length; ++i) {int x = nums[i];if (x == minK) minI = i;if (x == maxK) maxI = i;if (x < minK || x > maxK) i0 = i;ans += Math.max(0, Math.min(minI, maxI) - i0);}return ans;}
}

992. K 个不同整数的子数组

https://leetcode.cn/problems/subarrays-with-k-different-integers/description/

在这里插入图片描述
提示:
1 <= nums.length <= 2 * 10^4
1 <= nums[i], k <= nums.length

两个窗口分别保证窗口内不同元素的数量是 k 和 k - 1。
枚举右端点r,分别对应两个左端点l1和l2,l1~l2-1就是可选范围。

class Solution {public int subarraysWithKDistinct(int[] nums, int k) {int n = nums.length;int ans = 0;Map<Integer, Integer> m1 = new HashMap<>(), m2 = new HashMap<>();for (int l1 = 0, l2 = 0, r = 0; r < n; ++r) {m1.merge(nums[r], 1, Integer::sum);m2.merge(nums[r], 1, Integer::sum);while (m1.size() > k) {m1.merge(nums[l1], -1, Integer::sum);if (m1.get(nums[l1]) == 0) m1.remove(nums[l1]);l1++;}while (m2.size() > k - 1) {m2.merge(nums[l2], -1, Integer::sum);if (m2.get(nums[l2]) == 0) m2.remove(nums[l2]);l2++;}ans += l2 - l1;}return ans;}
}

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

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

相关文章

linux之buildroot(4)配置项目

Linux之buildroot(4)配置项目 Author&#xff1a;Onceday Date&#xff1a;2023年12月3日 漫漫长路&#xff0c;才刚刚开始… 全系列文章请查看专栏: buildroot编译框架_Once_day的博客-CSDN博客。 参考文档&#xff1a; Buildroot - Making Embedded Linux Easy 文章目录…

leetcode977. 有序数组的平方

题目描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&#xff0c…

《Junit单元测试》

目录 SpringBoot2.2.0版本之前的单元测试模式 SpringBoot2.2.0版本之后的单元测试模式 SpringBoot2.4以上版本移除了默认对Vintage的依赖 SpringBoot2.2.0版本之前的单元测试模式 SpringBooot 2.2.0 版本开始引入Junit5作为单元测试默认库&#xff0c;之前的版本是使用Junit…

Centos图形化界面封装OpenStack Centos镜像

目录 背景 环境 宿主机环境安装 创建与安装Centos7.8虚机 虚机设置 安全相关 安装ACPI服务 安装cloud-init 安装cloud-utils-growpart 停⽌虚拟机 删除个性化信息 模板化与压缩 登录与验证 背景 今天早上在Centos官网下载的CentOS-7-aarch64-GenericCloud-2003.…

计算机网络——习题

目录 一、填空题 二、选择题 一、填空题 1、在TCP/IP层次模型的网络层中包括的协议主要有 ARP、RARP、ICMP、IGMP 。 2、传输层的传输服务有两大类&#xff1a; 面向连接&#xff08;TCP&#xff09;和 无连接服务&#xff08;UDP&#xff09;。 3、Internet所提供的三项…

nodejs介绍

nodejs官网支持的各种库api https://nodejs.org/docs/latest-v21.x/api/http.html nodejs包括vp8引擎和内置的基本库如fs,path,http,querystring等&#xff0c;也可以用npm按转第三方库 npm是nodejs环境的包管理工具&#xff0c;可以为这个环境安装卸载各种包。 npm install pk…

首款跨语言RPC框架发布

开发历程 2019 ~ 2019 什么跨语言呢&#xff1f;比如你学了Java&#xff0c;你会写Service去调用业务代码&#xff0c;运用了OCP原则&#xff0c;可以使用接口编程&#xff0c;老师告诉我们&#xff0c;这样让接口开放&#xff0c;这样你新增功能的时候&#xff0c;就不用在源…

Javase | 贪吃蛇小游戏

目录: 1.贪吃蛇游戏介绍&#xff1a;&#xff08;该游戏代码不是很完善&#xff0c;可后续不断优化哦&#xff09;2.贪吃蛇游戏的代码操作步骤/讲解&#xff1a;3.贪吃蛇游戏的详细代码 :3.1MPanel.java3.2 Msnake.java 4.贪吃蛇游戏的代码分享 (获得代码 和 其中游戏图片)5.(继…

总结react中css的使用

1、css in js css in js有很多库&#xff0c;这里介绍styled-components styled-components 下载【vscode可以安装vscode-styled-components 插件&#xff0c;有代码提示】 npm i styled-components 1、然后为某个组件新建style.js文件&#xff0c;然后写一些样式。 impo…

【腾讯云HAI域探密】- AIGC应用助力企业降本增效之路

一、前言&#xff1a; 近年来&#xff0c;随着深度学习、大数据、人工智能、AI等技术领域的不断发展&#xff0c;机器学习是目前最火热的人工智能分支之一&#xff0c;是使用大量数据训练计算机程序&#xff0c;以实现智能决策、语音识别、图像处理等任务。 作者也是经过了以…

开源 Linux 系统 KDE neon 20231109 中文正式版来了

前言 开源 Linux 系统Neon 的外观和感觉很像 Linux 发行版,但其开发人员在其网站上非常公开地声称 Neon 不是真正的 Linux 发行版。它只是安装和运行 – 有点像。Neon 似乎是一个 Linux 操作系统。它会启动您的计算机。它显示了一个完整的桌面环境。它运行应用程序,所以你可…

【算法套路】(数组中)等价转换

文章目录 例题——2488. 统计中位数为 K 的子数组⭐【套路】子数组统计问题常用技巧&#xff1a;等价转换 相似题目列表面试题 17.05. 字母与数字525. 连续数组1124. 表现良好的最长时间段解法1解法2——利用单调栈 例题——2488. 统计中位数为 K 的子数组⭐ https://leetcode…

Proteus仿真--基于ADC0832设计的两路电压表

本文介绍基于ADC0832实现的双路电压表采集设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 采集芯片选用ADC0832&#xff0c;电压显示在LCD1602液晶显示屏上 仿真运行视频 Proteus仿真--基于ADC0832设计的两路电压表 附完整Proteus仿真资料代码资料…

【力扣206】反转链表

【力扣206】反转链表 一.题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1 &#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2 &#xff1a; 输入&#xff1a;head [1,2] 输出&#x…

sqlserver2019基本操作

一、下载管理工具 sql server2019官方的管理工具是SQL Server Management Studio 简称SSMS。 下载连接: https://learn.microsoft.com/zh-CN/sql/ssms/download-sql-server-management-studio-ssms?viewsql-server-ver16二、登录 1.连接服务器 点击 文件 --> 连接对象资…

harmonyOS学习笔记之stateStyles

stateStyles:多态样式 stateStyles可以依据组件的内部状态的不同,设置不同的样式 stateStyles是属性方法,可以根据状态来设置样式,类似于css伪类,但是语法不一样,ArkUI提供了四种状态: focused:获焦态 normal:正常态 pressed:按压态 disable:不可用态例如: Entry Component …

Mybatis-Plus更新时间字段不生效

一、背景 Mybatis-Plus是在Mybatis的基础上只做增强不做改变&#xff0c;主要是为简化开发。项目的背景是使用的就是Mybatis-Plus&#xff0c;但是在运行项目过程中发现一个问题&#xff0c;当使用Mybatis-Plus进行数据的更新的时候&#xff0c;更新字段没有按照我们所预想的进…

Springboot依赖注入时重复初始化Bean的问题

前言 最近做项目&#xff0c;发现了springboot2.7.x在参数initiate的时候可以反复初始化&#xff0c;而且首次异常后&#xff0c;第二次成功居然也可以启动&#xff0c;通过查看源代码发现了问题根源&#xff0c;且在springboot高版本3.x&#xff0c;就出现了了Configuration的…

qnx修改tcp和udp缓冲区默认大小

拷贝/home/test/qnx/qos223/target/qnx7/aarch64le/sbin/sysctl进系统中 https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/sysctl.html kern.sbmax 默认262144&#xff0c;这个限制住了发送、接收缓冲器大小 ./sysctl -w kern.sbmax10000…

尺寸公差软件 AI自动化建模在电控器装配测量中的应用

在公差仿真分析中&#xff0c;公差仿真模型的建立&#xff0c;是耗时、繁琐&#xff0c;但又必需的一步&#xff1a;手动建立特征、手动建立装配、手动建立公差、手动建立测量。往往需要几天时至几十天&#xff0c;才能将模型建立完成。 幸运的是&#xff0c;随着AI&#xff0…