《滑动窗口》不定长滑动窗口(求最长/最大)

news/2024/9/13 11:44:00/文章来源:https://www.cnblogs.com/XuGui/p/18376749

1. LeetCode 3 无重复字符的最长子串

方法1:滑动窗口 + 哈希

class Solution {public int lengthOfLongestSubstring(String s) {HashSet<Character> set = new HashSet<Character>();int left = 0, ans = 0;for (int right = 0; right < s.length(); right++) {while (set.contains(s.charAt(right)))set.remove(s.charAt(left++));ans = Math.max(ans, right - left + 1);set.add(s.charAt(right));}return ans;}
}
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:st = set(); left = ans = 0for right, ch in enumerate(s):while ch in st:st.remove(s[left])left += 1ans = max(ans, right - left + 1)st.add(ch)return ans

2. LeetCode 1493 删掉一个元素以后全为1的最长子数组

方法1:滑动窗口

class Solution {public int longestSubarray(int[] nums) {int left = 0, ans = 0, cnt = 0; // 标记当前 0 的个数for (int right = 0; right < nums.length; right++) {if (nums[right] == 0)cnt += 1;while (cnt > 1) {if (nums[left] == 0)cnt -= 1;left += 1;}// 保证[left , right]中只有一个 0ans = Math.max(ans, right - left + 1);}return ans - 1;}
}
class Solution:def longestSubarray(self, nums: List[int]) -> int:cnt, left, ans = 0, 0, 0for right, x in enumerate(nums):if x == 0:cnt += 1while cnt > 1:if nums[left] == 0:cnt -= 1left += 1# 保证[left, right]中只有一个 0ans = max(ans, right - left + 1)return ans - 1 # 减去其中需要删除的一个元素

方法2:思维 + 前缀和

class Solution {public int longestSubarray(int[] nums) {int n = nums.length;int[] prev = new int[n]; // 当前位置结尾前面连续 1 的个数prev[0] = nums[0]; // 初始化for (int i = 1; i < n; i++)prev[i] = nums[i] == 1 ? prev[i - 1] + 1 : 0;int[] next = new int[n]; // 当前位置结尾后面连续 1 的个数next[n - 1] = nums[n - 1]; // 初始化for (int i = n - 2; i >= 0; i--)next[i] = nums[i] == 1 ? next[i + 1] + 1 : 0;int ans = 0;for (int i = 0; i < n; i++) { // 枚举要删除的位置int prevS = i == 0 ? 0 : prev[i - 1];int nextS = i == n - 1 ? 0 : next[i + 1];    ans = Math.max(ans, prevS + nextS);}return ans;}
}
class Solution:def longestSubarray(self, nums: List[int]) -> int:n = len(nums)pre = [nums[0]] * n; nxt = [nums[n - 1]] * nfor i in range(1, n): # 初始化 pre 数组pre[i] = 0 if nums[i] == 0 else pre[i - 1] + 1for i in range(n - 2, -1, -1):nxt[i] = 0 if nums[i] == 0 else nxt[i + 1] + 1ans = 0for i in range(n):preS = 0 if i == 0 else pre[i - 1]nxtS = 0 if i == n - 1 else nxt[i + 1]ans = max(ans, preS + nxtS)return ans

3. LeetCode 2730 找到最长的半重复子字符串

方法1:滑动窗口

class Solution {public int longestSemiRepetitiveSubstring(String s) {int val = 0, left = 0, ans = 1; // 当只有一个字符时返回 1for (int right = 1; right < s.length(); right++) {if (s.charAt(right) == s.charAt(right - 1))val += 1; // 相邻重复个数加 1while (val > 1) {if(s.charAt(left) == s.charAt(left + 1))val -= 1;left += 1;}ans = Math.max(ans, right - left + 1);}return ans;}
}
class Solution:def longestSemiRepetitiveSubstring(self, s: str) -> int:cnt, left, ans = 0, 0, 1for right in range(1, len(s)):if s[right - 1] == s[right]:cnt += 1while cnt > 1:if s[left] == s[left + 1]:cnt -= 1left += 1ans = max(ans, right - left + 1)return ans

4. LeetCode 904 水果成篮

方法1:滑动窗口 + 哈希表

class Solution {public int totalFruit(int[] fruits) {// 标记区间数字出现次数HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();// left:左端点 ans:最终答案int left = 0, ans = 0;for (int right = 0; right < fruits.length; right++) {map.merge(fruits[right], 1, Integer::sum);while (map.size() > 2) {if (map.merge(fruits[left], -1, Integer::sum) == 0)map.remove(fruits[left]);                left += 1;}ans = Math.max(ans, right - left + 1);}   return ans;}
}
class Solution:def totalFruit(self, fruits: List[int]) -> int:cnt = Counter() # python的计数器left, ans = 0, 0for right, x in enumerate(fruits):cnt[x] += 1 # 如果不存在会自动创建while len(cnt) > 2:cnt[fruits[left]] -= 1if cnt[fruits[left]] == 0: # 需要手动删除cnt.pop(fruits[left])left += 1ans = max(ans, right - left + 1)return ans

5. LeetCode 1695 删除子数组的最大得分

方法1:滑动窗口 + 哈希表

class Solution {public int maximumUniqueSubarray(int[] nums) {HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();int left = 0, val = 0, ans = 0;for (int right = 0; right < nums.length; right++) {map.merge(nums[right], 1, Integer::sum);val += nums[right];while (map.get(nums[right]) > 1) {map.merge(nums[left], -1, Integer::sum);// 此处可以删除键值为 0 的键val -= nums[left]; left++;}ans = Math.max(ans, val);}return ans;}
}
class Solution:def maximumUniqueSubarray(self, nums: List[int]) -> int:cnt = Counter() # 统计每个数字出现的次数left, val, ans = 0, 0, 0for right, x in enumerate(nums):cnt[x] += 1; val += xwhile cnt[x] > 1:cnt[nums[left]] -= 1val -= nums[left]# 此处可以删除个数为 0 的键left += 1ans = max(ans, val)return ans

6. LeetCode 2958 最多 K 个重复元素的最长子数组

方法1:滑动窗口 + 哈希表

class Solution {public int maxSubarrayLength(int[] nums, int k) {HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();int left = 0, ans = 0;for (int right = 0; right < nums.length; right++) {map.merge(nums[right], 1, Integer::sum);while (map.get(nums[right]) > k) {map.merge(nums[left], -1, Integer::sum);// 此处可以删除键值为 0 的键left++;}ans = Math.max(ans, right - left + 1);}return ans;}
}
class Solution:def maxSubarrayLength(self, nums: List[int], k: int) -> int:cnt = Counter() # 统计每个数字出现的次数left, ans = 0, 0for right, x in enumerate(nums):cnt[x] += 1while cnt[x] > k:cnt[nums[left]] -= 1# 此处可以删除个数为 0 的键left += 1ans = max(ans, right - left + 1)return ans

7. LeetCode 1004 最大连续1的个数III

方法1:滑动窗口

class Solution {public int longestOnes(int[] nums, int k) {int cnt = 0, left = 0, ans = 0;for (int right = 0; right < nums.length; right++) {cnt += nums[right] == 0 ? 1 : 0;while (cnt > k) {cnt -= nums[left] == 0 ? 1 : 0;left += 1;}ans = Math.max(ans, right - left + 1);}return ans;}
}
class Solution:def longestOnes(self, nums: List[int], k: int) -> int:cnt, left, ans = 0, 0, 0for rigth, x in enumerate(nums):cnt += 1 if x == 0 else 0while cnt > k:cnt -= 1 if nums[left] == 0 else 0left += 1ans = max(ans, rigth - left + 1)return ans

8. LeetCode 2024 考试的最大困扰度

方法1:滑动窗口

class Solution {public int maxConsecutiveAnswers(String answerKey, int k) {return Math.max(longest(answerKey, k, 'T'), longest(answerKey, k, 'F'));}public int longest(String s, int k, char ch) {int cnt = 0, left = 0, ans = 0;for (int right = 0; right < s.length(); right++) {cnt += s.charAt(right) == ch ? 1 : 0;while (cnt > k) {cnt -= s.charAt(left) == ch ? 1 : 0;left += 1;}ans = Math.max(ans, right - left + 1);}return ans;}
}
class Solution:def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:return max(self.longest(answerKey, k, 'T'), self.longest(answerKey, k, 'F'))def longest(self, s: str, k: int, ch: str) -> int:cnt, left, ans = 0, 0, 0for rigth, x in enumerate(s):cnt += 1 if x == ch else 0while cnt > k:cnt -= 1 if s[left] == ch else 0left += 1ans = max(ans, rigth - left + 1)return ans

9.

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

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

相关文章

网站405错误怎么解决

网站出现405 Method Not Allowed错误通常意味着服务器理解了请求头,但拒绝执行请求方法(如GET、POST、PUT、DELETE等)。这种错误通常是因为服务器不允许使用特定的HTTP方法访问某个资源。以下是一些解决405 Method Not Allowed错误的方法:检查请求方法:确认你使用的HTTP请…

Adobe Substance 3D Sampler v4.2.2 下载及安装教程(3D材质管理软件)

前言 Substance 3D Sampler简称“Sa”是一款由Adobe新推出的3D真实材质贴图制作软件。允许用户通过调整和混合现有材料,或通过扫描(单个或多个图像)中提取新材料来创建和迭代材料集合,从而轻松将真实的图片转换为具有真实感的表面或HDR环境,为用户创作出更为丰富的材质贴图…

网站还原错误怎么解决

在安装网站的过程中遇到了“网站还原错误”,那么这个问题可能是指在网站备份恢复时遇到的错误。这种情况通常发生在网站迁移或恢复备份文件时。 下面是一些解决“网站还原错误”的方法:检查备份文件的完整性和正确性:确保备份文件没有损坏或不完整。 使用文件压缩软件(如Wi…

信息学奥赛初赛天天练-73-NOIP2016普及组-基础题4-枚举法、放苹果、统筹方法

NOIP 2016 普及组 基础题4 16 有 7个一模一样的苹果,放到 3个一样的盘子中,一共有( )种放法 A 7 B 8 C 21 D 3^7 17 下图表示一个果园灌溉系统,有 A,B,C,DA,B,C,D 四个阀门,每个阀门可以打开或关上,所有管道粗细相同,以下设置阀门的方法中, 可以让果树浇上水的是…

网站证书错误怎么解决?怎么解决网站证书错误

网站证书错误通常是因为SSL/TLS证书出现问题导致的。这类错误可能会出现在浏览器的地址栏中,提示用户该网站的安全证书存在问题。下面是一些常见的解决方法:确认网站安全:确认该网站是可信的,而不是钓鱼网站。检查系统时间:确认你的计算机系统时间设置正确。 如果时间不正…

网站cms备案号位置怎么更改

要更改网站CMS备案号的位置,通常需要通过编辑模板文件来实现。以下是一般的步骤:登录CMS后台:登录你所使用的CMS(例如织梦CMS、帝国CMS等)的后台管理界面。找到模板管理:在后台管理界面中找到“模板管理”或类似的选项。编辑模板文件:选择需要更改备案号位置的模板文件,…

织梦cms数据库配置文件在哪

织梦CMS的数据库配置文件通常位于 /data/common.inc.php 文件中。在这个文件里,你可以找到与数据库连接相关的配置信息。 具体的配置项包括:$cfg_dbhost:数据库地址,默认为 localhost。 $cfg_dbname:数据库名称。 $cfg_dbuser:数据库用户名。 $cfg_dbpwd:数据库密码。当…

织梦dede:php标签是什么

{dede:php} 标签是织梦CMS (DedeCMS) 中的一个特殊标签,用于在模板文件中嵌入 PHP 代码。这个标签允许开发者在织梦CMS的模板中直接编写 PHP 代码,从而实现更灵活的逻辑处理。 用法概述标签语法:开始标签:{dede:php} 结束标签:{/dede:php}基本用法:在 {dede:php} 和 {/de…

虚拟化技术简介

在计算机科学中,虚拟化技术(Virtualization)是一种资源管理技术,将计算机的各种物理资源予以抽象、转换,然后呈现出来的一个可供分割并任意组合为一个或多个虚拟计算机的配置环境。虚拟化技术是云计算的基础,本文将简介虚拟化技术,同时介绍虚拟化技术在云计算中的重要作…

Oracle21C创建用户

Oracle21C创建用户 1. 连接数据库 在命令行使用: sqlplus system/<password>@//<hostname>:<port>/<service_name> # 示例 sqlplus system/123456 sqlplus / as sysdba使用图形化工具(datgrip2019.3): 使用sys用户时连接会报错。如下所示: The sp…

jmeter操作数据库

jmeter操作数据库 一、jmeter操作数据的前期工作 jmeter是java语言编写的 1、在操作数据库之前要安装jdbc ,数据库驱动,如上图就是驱动下载驱动 2、将驱动存放在指定路径下(jmeter和java的lib与lib\ext目录下)3、在jmeter的测试计划中导入驱动(浏览完成即可)4、新建一个线程…

帝国cms如何解决截图出现黑边的问题

帝国CMS截图出现黑边的问题通常是由于系统在生成缩略图时采用的高度缩放方式导致的。当图片的宽度大于高度时(即横幅图片),帝国CMS会按照高度进行缩放,而宽度不足的部分则用黑色填充,从而产生黑边。 为了解决这个问题,可以采取以下步骤:修改图片缩放方式:将按高度缩放改…