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

每日算法刷题Day10 5.19:leetcode不定长滑动窗口求最长/最大4道题,结束定长滑动窗口,用时1h

不定长滑动窗口

不定长滑动窗口主要分为三类:求最长子数组,求最短子数组,以及求子数组个数。

  • 注:滑动窗口相当于在维护一个队列。右指针的移动可以视作入队,左指针的移动可以视作出队。
    滑动窗口【基础算法精讲 03】

求最长/最大

1.一般题目都有「至多」的要求。
2.核心:找窗口成立的条件

模版套路
1.套路

三步走:入窗口-出窗口-更新答案(窗口大小)

  • 1.入窗口:下标为right的元素进入窗口,更新相关统计量
  • 2.出窗口:right进入,统计量更新,可能导致当前窗口不满足要求。根据条件用while循环让下标为left 的元素依次离开窗口,更新相关统计量,直至满足条件。
  • 3.更新答案窗口大小为right-left+1,res=max(res,right-left+1)
    c++:
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();int res = 0;map<char, int> cnt;int left = 0;for (int right = 0; right < n; right++) {// 1.right入窗口,更新统计量++cnt[s[right]];// 2.不满足条件,left出窗口while (cnt[s[right]] > 1) {--cnt[s[left]];left++;}// 3.更新答案res = max(res, right - left + 1);}return res;}
};
2.题目描述

1.给定一个字符串 s ,请你找出其中不含有重复字符(窗口条件)的 最长 子串 的长度。
2.给你一个字符串 s ,请找出满足每个字符最多出现两次(窗口条件)的最长子字符串,并返回该子字符串的 最大 长度。
3.给你一个二进制数组 nums ,你需要从中删掉一个元素。请你在删掉元素的结果数组中,返回最长的且只包含 1(窗口条件) 的非空子数组的长度。
(题意转化为,不定长窗口最多只有1个0(窗口条件),求不定长窗口的最长长度-1(因为必须删除一个元素))
4.如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度,用于变更字符串的最大预算是 maxCost。(窗口条件)

3.学习经验
1. 3.无重复字符的最长子串(中等)

3. 无重复字符的最长子串 - 力扣(LeetCode)

思想

1.给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
2.不含有重复字符用map作为统计量来维护

代码

c++:

class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();int res = 0;map<char, int> cnt;int left = 0;for (int right = 0; right < n; right++) {// 1.right入窗口,更新统计量++cnt[s[right]];// 2.不满足条件,left出窗口while (cnt[s[right]] > 1) {--cnt[s[left]];left++;}// 3.更新答案res = max(res, right - left + 1);}return res;}
};
2. 3090.每个字符最多出现两次的最长子字符串(简单)

3090. 每个字符最多出现两次的最长子字符串 - 力扣(LeetCode)

思想

1.给你一个字符串 s ,请找出满足每个字符最多出现两次最长子字符串,并返回该子字符串的 最大 长度。
2.条件变为每个字符最多出现两次,改变第1题的条件即可

代码

c++:

class Solution {
public:int maximumLengthSubstring(string s) {int n = s.size();int res = 0;map<char, int> cnt;int left = 0;for (int right = 0; right < n; ++right) {++cnt[s[right]];while (cnt[s[right]] > 2) {--cnt[s[left]];++left;}res = max(res, right - left + 1);}return res;}
};
3. 1493.删除一个元素以后全为1的最长子数组(中等,题意转换)

1493. 删掉一个元素以后全为 1 的最长子数组 - 力扣(LeetCode)

思想

1.给你一个二进制数组 nums ,你需要从中删掉一个元素。
请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。
2.题意转化为,不定长窗口最多只有1个0,求不定长窗口的最长长度-1(因为必须删除一个元素)

代码

c++:

class Solution {
public:int longestSubarray(vector<int>& nums) {int n = nums.size();int res = 0, cnt0 = 0;int left = 0;for (int right = 0; right < n; ++right) {if (nums[right] == 0)++cnt0;while (cnt0 > 1) {if (nums[left] == 0)--cnt0;++left;}res = max(res, right - left + 1 - 1); // 删除掉一个元素长度减1}return res;}
};
4. 1208.尽可能使字符串相等

1208. 尽可能使字符串相等 - 力扣(LeetCode)

思想

1.如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度,用于变更字符串的最大预算是 maxCost。(窗口条件限制)

代码

c++:

class Solution {
public:int equalSubstring(string s, string t, int maxCost) {int n = s.size(), m = t.size();int res = 0;int cost = 0;int left = 0;for (int right = 0; right < n && right < m; ++right) {cost += abs(s[right] - t[right]);while (cost > maxCost) {cost -= abs(s[left] - t[left]);++left;}res = max(res, right - left + 1);}return res;}
};

相关文章:

  • 大模型的开发应用(三):基于LlaMAFactory的LoRA微调(上)
  • CSS之box-sizing、图片模糊、计算盒子宽度clac、(重点含小米、进度条案例)过渡
  • 再议AOI算法
  • 谈谈mysql的日志的用途
  • Google精准狙击OpenAI Codex,发布AI编程助手Jules!
  • Kubernetes在线练习平台深度对比:KillerCoda与Play with Kubernetes
  • Rofin PowerLine E Air维护和集成手侧激光Maintenance and Integration Manual
  • 本地ip如何映射到外网?借助端口映射软件把内网地址给别人用
  • Python 包管理工具核心指令uv sync解析
  • 学习STC51单片机08(芯片为STC89C52RC)
  • 五、central cache的设计
  • unity XCharts插件生成曲线图在UICanvas中
  • TrollStore(巨魔商店)的由来介绍
  • 山东大学计算机图形学期末复习完结篇上——24历年题
  • CAU数据库class3 关系型数据库基础
  • 2001-2023年上市公司管理讨论与分析文本数据(MDA文本数据)
  • 【算法】定长滑动窗口5.20
  • 十五、面向对象底层逻辑-BeanDefinitionRegistryPostProcessor接口设计
  • 瀚高安全版4.5.8/4.5.9字符串默认按字节存储导致数据无法写入(APP)
  • Python 包管理工具uv依赖分组概念解析
  • 山西资深公益人士孙超因突发急病离世,终年37岁
  • 90后青年学者李海增逝世9个月后文章登上顶刊,同仁缅怀其贡献
  • 国家发改委:安全是低空经济发展的首要前提,稳妥推进低空旅游、航空运动等发展
  • 钟南山谈新冠阳性率升高:可防可治不用慌,高危人群应重点关注
  • 探月工程鹊桥二号中继星取得阶段性进展
  • 大学2025丨苏大教授王尧:文科最大的危机是阐释世界的能力弱化