滑动窗口序列(单序列双指针)9/5

embedded/2024/11/13 9:16:20/

一、不间断子数组(滑动窗口+哈希表)

题意:

给你一个数组nums,现在求子数组中都有 0 <= |nums[i1] - nums[i2]| <= 2 。这样称一个不间断子数组。(简而言之:子数组中最大值和最小值的差距必须<=2)。求不间断子数组的数量

输入:nums = [5,4,2,4]
输出:8
解释:
大小为 1 的不间断子数组:[5], [4], [2], [4] 。
大小为 2 的不间断子数组:[5,4], [4,2], [2,4] 。
大小为 3 的不间断子数组:[4,2,4] 。
思路:

1.本来试图使用int max ,int min来记录滑动窗口中的最大值和最小值,然后发现当窗口左移的时候,最大值和最小值无法更新。因此需要借助TreeMap(基于红黑树的哈希表) 帮我们自动实现升序

2.滑动窗口左移的条件是:窗口中最大值-最小值>2,左移到<=2为止

3.每次遍历结束后 收割结果:res+=right-left+1

代码:
class Solution {public long continuousSubarrays(int[] nums) {long res=0;int left=0;int right=0;TreeMap<Integer, Integer> freqMap = new TreeMap<Integer,Integer>();while(right<nums.length){//往哈希表中放值freqMap.put(nums[right],freqMap.getOrDefault(nums[right],0)+1);//如果滑动窗口不满足条件了 就要左移while(freqMap.lastKey()-freqMap.firstKey()>2){int leftNum=nums[left];freqMap.put(nums[left],freqMap.get(nums[left])-1);if(freqMap.get(nums[left])==0)freqMap.remove(nums[left]);left++;}res+=right-left+1;right++;}return res;}
}

二、单字符重复子串的最大长度

如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。

给你一个字符串 text,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。

题意:

在给定的字符串中,只交换一次字符,求最大重复字串的长度。

思路:

要求最大重复子串的长度:xxxixxxa

1.首先找到该字符重复字串1,遇到不同的字符停止,记重复子串的长度为:len1,停止时的下标为:j

2. 从j+1开始,找到不同字符后的该字符重复子串2 记长度为:len2

因为重复子串2可以到字符串的结尾,导致后面没有字符和不同的字符做交换。

那么就要取Math.min(len1+len2+1,cnt[s.charAt(i)])

代码:
class Solution {public int maxRepOpt1(String text) {//统计各个字符的数量int[] cnt=new int[26];for(char ch:text.toCharArray())cnt[ch-'a']++;//滑动窗口int left=0;int right=0;int size=text.length();int res=0;while(left<size){right=left;while(right<size&&text.charAt(right)==text.charAt(left)){right++;}//相等的长度为 j-i 此时j所指向的字符是不相同的int len1=right-left;int SecondRight=right+1;while(SecondRight<size&&text.charAt(SecondRight)==text.charAt(left)){SecondRight++;}//第二段字母相同的字串int len2=SecondRight-right-1;//为什么是Math.min(l+r+1,cnt[text.charAt(right)-'a'])//l+r+1(这里要求在r之后还要有该字母) 如果是这种:aaabaaa 就不行了res=Math.max(res,Math.min(len1+len2+1,cnt[text.charAt(left)-'a']));left++;}return res;}
}

http://www.ppmy.cn/embedded/107187.html

相关文章

Android 14(API 级别 34)中,DexClassLoader 不再支持可写 dex/jar 文件

Android 14&#xff08;API 级别 34&#xff09;中&#xff0c;DexClassLoader 不再支持从可写文件加载 dex/jar 文件。这意味着从Android 14开始&#xff0c;你不能再使用 DexClassLoader 来动态加载位于内部存储中的dex/jar文件&#xff0c;除非这些文件被设置为只读。 解决…

2024国赛数学建模A题思路模型代码

2024国赛数学建模思路资料&#xff0c;思路获取见文末名片 数学建模感想 纪念逝去的大学数学建模&#xff1a;两次校赛&#xff0c;两次国赛&#xff0c;两次美赛&#xff0c;一次电工杯。从大一下学期组队到现在&#xff0c;大三下学期&#xff0c;时间飞逝&#xff0c;我的…

Unity数据持久化 之 二进制存储法

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 前置知识&#xff1a;1 Byte 8 bit &#xff0c;所以0000 00001 就是一个字节&#xff0c; 该串数字转为十进制代表1…

2024.8.29 Python,排序算法,列表的append规则

1.append和 res[] nums1[1,2,3] res.append(nums1[1]) print(res)#输出[2] res.append([nums1[1]]) print(res)#输出[[2]] res.append(nums1[1:2]) print(res)#输出[[2]] res.append(nums1[1:3]) print(res)#输出[[2,3]] resnums1[1:3] print(res)#输出[2,3]也就是说&#xff…

【MATLAB源码-第164期】基于matlab的轴承故障三种谱图:细化谱,功率谱,倒谱对比分析仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 轴承故障分析是一种重要的维护和监控手段&#xff0c;能够帮助工程师及时发现和解决轴承在运行中可能遇到的各种问题。在轴承故障诊断中&#xff0c;通常会使用到三种谱图分析方法&#xff1a;细化谱&#xff08;Fine Spectr…

Django国际化和本地化

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介…

蜜罐的识别

蜜罐技术本质上是对网络攻击方欺骗的一项技术&#xff0c;通过在服务上布置一些仿真的系统、网络服务、或是模拟一些物联网设备来诱惑攻击方对其实施攻击从而捕获攻击行为&#xff0c;分析攻击手段与方式&#xff0c;或是收集一些攻击者的个人信息来进行分析画像达到精准溯源的…

docker-记录一次docker-compose部署容器挂载权限问题

一、背景 需要在单独的docker环境部署一套应用程序&#xff0c;包括mqtt&#xff0c;数据库&#xff0c;应用等 二、问题 部署mqtt服务使用的是emqx服务。 下面是部分docker-compose.yml的内容 emqx:container_name: minqing_emqximage: xxx.xxx.cn/minqing/emqx/emqxports:…