刷题笔记 - 滑动窗口

文章目录

    • 滑动窗口
      • 最长无重复子串
      • 最小覆盖子串
      • 串联所有单词的子串
      • 长度最小的子数组
      • 滑动窗口最大值
      • 字符串的排列
      • 最小区间

滑动窗口

所有题目来自leetcode的回答:https://leetcode.cn/problems/longest-substring-without-repeating-characters/solutions/3982/hua-dong-chuang-kou-by-powcai

会员题没有列出来。

最长无重复子串

题目:https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/

class Solution {public int lengthOfLongestSubstring(String s) {int n = s.length();if (n == 0) return 0;Map<Character, Integer> map = new HashMap<>();int res = 0, left = 0;for (int i = 0; i < n; i ++) {if (map.containsKey(s.charAt(i))) {left = Math.max(left, map.get(s.charAt(i)) + 1);}map.put(s.charAt(i), i);res = Math.max(res, i - left  + 1);}return res;}
}

最小覆盖子串

题目:https://leetcode.cn/problems/minimum-window-substring/description/

class Solution {Map<Character, Integer> cnts = new HashMap<>();Map<Character, Integer> cntt = new HashMap<>();public String minWindow(String s, String t) {int ls = s.length(), lt = t.length();int milen = Integer.MAX_VALUE, st = 0,  ed = 0, mist = 0, mied = 0;boolean isNull = false;for (int i = 0 ; i < lt; i ++) {cntt.put(t.charAt(i), cntt.getOrDefault(t.charAt(i), 0) + 1);}while (ed < ls) {if (cntt.containsKey(s.charAt(ed))) {cnts.put(s.charAt(ed), cnts.getOrDefault(s.charAt(ed), 0) + 1);while (check()) {  // 这里是while,一步更新到第二个在cntt里的字符,过滤掉无用字符isNull = true;if (milen > ed - st + 1) {milen = ed - st + 1;mist = st;mied = ed;}if (cntt.containsKey(s.charAt(st))) {cnts.put(s.charAt(st), cnts.getOrDefault(s.charAt(st), 0) - 1);}st ++;}}ed ++;}if (!isNull) return "";return s.substring(mist, mied + 1);}private boolean check() {Iterator iter = cntt.entrySet().iterator();while (iter.hasNext()) {Map.Entry entry = (Map.Entry) iter.next();Character key = (Character) entry.getKey();Integer val = (Integer) entry.getValue();if (cnts.getOrDefault(key, 0) < val) return false;}return true;}
}

串联所有单词的子串

题目:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/description/

题解:https://leetcode.cn/problems/substring-with-concatenation-of-all-words/solutions/3825/chuan-lian-suo-you-dan-ci-de-zi-chuan-by-powcai

// 对words中的所有单词,维护一个单词计数map
// 串联子串中保证了每个子单词的原字符顺序不变
class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length(), n = words.length;int lw = n * words[0].length(), oneLen = words[0].length();List<Integer> res = new ArrayList<>();if (lw > ls) return res;Map<String, Integer> wordsMap = new HashMap<>();for (int i = 0; i < n; i ++) {wordsMap.put(words[i], wordsMap.getOrDefault(words[i], 0) + 1);}for (int i = 0; i < ls - lw + 1; i ++) {  //  i < ls - lw + 1,保证能枚举到最后一个窗口的第一个下标位置Map<String, Integer> tmpMap = new HashMap<>();for (int j = i; j < i + lw; j += oneLen) {String subStr = s.substring(j, j + oneLen);tmpMap.put(subStr, tmpMap.getOrDefault(subStr, 0) + 1);}if (wordsMap.equals(tmpMap)) res.add(i);}return res; }
}

优化:(常规的滑动窗口思路,和最小覆盖子串的代码逻辑相似)

class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length(), n = words.length;int lw = n * words[0].length(), oneLen = words[0].length();List<Integer> res = new ArrayList<>();if (lw > ls) return res;Map<String, Integer> wordsMap = new HashMap<>();for (int i = 0; i < n; i ++) {wordsMap.put(words[i], wordsMap.getOrDefault(words[i], 0) + 1);}for (int i = 0; i < oneLen; i ++) {  // 保证枚举到所有单词[0...oneLen], [1...oneLen + 1], ...int st = i, ed = i, cnt = 0;Map<String, Integer> tmpMap = new HashMap<>();while (ed < ls - oneLen + 1) {  // 同解法一的判断String subStr = s.substring(ed, ed + oneLen);tmpMap.put(subStr, tmpMap.getOrDefault(subStr, 0) + 1);ed += oneLen;cnt ++;  // 当前窗口里有几个单词while(tmpMap.getOrDefault(subStr, 0) > wordsMap.getOrDefault(subStr, 0)) {// 窗口里的单词并不在wordsMap里,移动窗口// 或者,窗口里当前单词重复出现了,移动窗口String stStr = s.substring(st, st + oneLen);  // 窗口里最左边的单词tmpMap.put(stStr, tmpMap.getOrDefault(stStr, 0) - 1);st += oneLen;cnt --;}if (cnt == n) res.add(st);}}return res;}
}

再优化(直接跳过不在words里的单词和窗口):

class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length(), n = words.length;int lw = n * words[0].length(), oneLen = words[0].length();List<Integer> res = new ArrayList<>();if (lw > ls) return res;Map<String, Integer> wordsMap = new HashMap<>();for (int i = 0; i < n; i ++) {wordsMap.put(words[i], wordsMap.getOrDefault(words[i], 0) + 1);}for (int i = 0; i < oneLen; i ++) {  // 保证枚举到所有单词[0...oneLen], [1...oneLen + 1], ...int st = i, ed = i, cnt = 0;Map<String, Integer> tmpMap = new HashMap<>();while (ed < ls - oneLen + 1) {  // 同解法一的判断String subStr = s.substring(ed, ed + oneLen);ed += oneLen;if (!wordsMap.containsKey(subStr)) {/**当前窗口的当前单词不是words里的单词,肯定不符合题意,更新窗口。题中要求所有串联单词必须挨在一起,这个判断过滤掉不挨在一起的窗口*/cnt = 0;st = ed;tmpMap.clear();continue;}tmpMap.put(subStr, tmpMap.getOrDefault(subStr, 0) + 1);cnt ++;  // 当前窗口里有几个单词while(tmpMap.getOrDefault(subStr, 0) > wordsMap.getOrDefault(subStr, 0)) {// 窗口里的单词并不在wordsMap里,移动窗口// 或者,窗口里当前单词重复出现了,移动窗口String stStr = s.substring(st, st + oneLen);  // 窗口里最左边的单词tmpMap.put(stStr, tmpMap.getOrDefault(stStr, 0) - 1);st += oneLen;cnt --;}if (cnt == n) res.add(st);}}return res;}
}

长度最小的子数组

题目:https://leetcode.cn/problems/minimum-size-subarray-sum/description/

class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length;int milen = Integer.MAX_VALUE, st = 0, ed = 0, sum = 0;boolean isNull = false;while (ed < n) {sum += nums[ed];while (sum >= target) {isNull = true;if (milen > ed - st + 1) {milen = ed - st + 1;}sum -= nums[st];st ++;}ed ++;}if (!isNull) return 0;return milen;}
}

滑动窗口最大值

题目:https://leetcode.cn/problems/sliding-window-maximum/description/

题解:https://leetcode.cn/problems/sliding-window-maximum/solutions/2361228/239-hua-dong-chuang-kou-zui-da-zhi-dan-d-u6h0

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {// 借鉴最小栈的思路,再O(1)时间内找出窗口内的最大值// 双向队列维持一个窗口内的非严格递减排序// 队头是窗口内的最大值int n = nums.length;if (k == 1) return nums;int[] res = new int[n - k + 1];Deque<Integer> dq = new LinkedList<>();int idx = 0;for (int i = 0; i < k; i ++) {while (!dq.isEmpty() && dq.peekLast() < nums[i]) {dq.removeLast();}dq.addLast(nums[i]);}res[idx ++] = dq.peekFirst();for (int i = k; i < n; i ++) {if (dq.peekFirst() == nums[i - k]) dq.removeFirst();while (!dq.isEmpty() && dq.peekLast() < nums[i]) {dq.removeLast();}dq.addLast(nums[i]);res[idx ++] = dq.peekFirst();}return res;}
}

字符串的排列

题目:https://leetcode.cn/problems/permutation-in-string/description/

题解-方法二:https://leetcode.cn/problems/smallest-range-covering-elements-from-k-lists/solutions/355881/zui-xiao-qu-jian-by-leetcode-solution

class Solution {public boolean checkInclusion(String s1, String s2) {int ls1 = s1.length(), ls2 = s2.length();if (ls1 > ls2) return false;int[] cnt1 = new int[26], cnt2 = new int[26];for (int i = 0; i < ls1; i ++) {cnt1[s1.charAt(i) - 'a'] ++;cnt2[s2.charAt(i) - 'a'] ++;}if (Arrays.equals(cnt1, cnt2)) return true;for (int i = ls1; i < ls2; i ++) {cnt2[s2.charAt(i - ls1) - 'a'] --;cnt2[s2.charAt(i) - 'a'] ++;if (Arrays.equals(cnt1, cnt2)) return true;}return false;}
}

最小区间

题目:https://leetcode.cn/problems/smallest-range-covering-elements-from-k-lists/description/

class Solution {public int[] smallestRange(List<List<Integer>> nums) {int n = nums.size();Map<Integer, List<Integer>> index = new HashMap<>();int mi = Integer.MAX_VALUE, mx = Integer.MIN_VALUE;for (int i = 0; i < n; i ++) {for (int item : nums.get(i)) {List<Integer> tmp = index.getOrDefault(item, new ArrayList<Integer>());tmp.add(i);index.put(item, tmp);if (mi > item) mi = item;if (mx < item) mx = item;}}int st = mi, ed = mi - 1, ansSt = 0, ansEd = Integer.MAX_VALUE, cnt = 0;// System.out.println(mi + ", " + mx);int[] interval = new int[n];   // 记录滑动窗口覆盖了多少区间,下标标识某个区间while (ed < mx) {ed ++;if (index.containsKey(ed)) {for (int idx : index.get(ed)) {  // 枚举被覆盖的区间interval[idx] ++;if (interval[idx] == 1) {  // idx标识的区间第一次被覆盖时,标记该区间被覆盖cnt ++;}while (cnt == n) {  // 当所有区间被覆盖,更新最小区间和窗口if (ed - st < ansEd - ansSt) {// System.out.println("*--*-*-");ansSt = st;ansEd = ed;}if (index.containsKey(st)) {  // 更新最小区间的左端点,看是否能覆盖全部区间for (int leftIdx : index.get(st)) {interval[leftIdx] --;if (interval[leftIdx] == 0) {cnt --;}}}st ++;}}}}return new int[] {ansSt, ansEd};}
}

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

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

相关文章

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程&#xff0c;从最开始的想法到代码提交的详细记录&#xff0c;有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接&#xff1a;LINK 看题目意思是就是给你一个数X&…

uni-app 安装 uni-app-fetch 进行接口请求的封装

1、在 uni-app 中通过 uni.request 发起网络请求&#xff0c;在实际的应用中需要结合一些业务场景进行二次封装&#xff0c;比如配置 baseURL、拦截器等&#xff0c; 1、uni-app-fetch 是对 uni.request 的封装&#xff0c;通过 npm 来安装该模块 # 安装 uni-app-fetch 模块 …

04.化栈为队

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

MySQL LRU算法(冷热数据分离)

背景 MySQL中使用的InnoDB存储引擎采用了一种特别的最近最少使用&#xff08;LRU, Least Recently Used&#xff09;算法来管理其Buffer Pool中的页&#xff08;包括数据页和索引页&#xff09;。Buffer Pool是InnoDB用来缓存数据&#xff0c;以减少磁盘I/O操作的内存区域。正…

初识C语言——第十一天

操作符&#xff1a; 1. 算数操作符&#xff1a; - * / % 2. 移位操作符&#xff1a; >> &#xff08;右移&#xff09; << &#xff08;左移&#xff09; 移动的是二进制位 例如&#xff1a; int ba<<1; 3. 位操作符&#xff1a; & 按位与 | 按位…

活动预告 | 5月16日 Streaming Lakehouse Meetup · Online 与你相约!

随着 Apache Flink 技术社区的不断成熟和发展&#xff0c;越来越多企业开始利用 Flink 进行流式数据处理&#xff0c;从而提升数据时效性价值&#xff0c;获取业务实时化效果。与此同时&#xff0c;在大数据领域数据湖架构也日益成为新的技术趋势&#xff0c;越来越多企业开始采…

NERF++:Analyzing and Improving Neural Radiance Fields神经辐射场的分析与改进

ABSTRACT 神经辐射场(NeRF)可以实现各种捕获设置的令人印象深刻的视图合成结果&#xff0c;包括360度捕获有界场景和前向捕获有界和无界场景。NeRF 将代表视图不变不透明度和视图相关颜色体积的多层感知器(MLPs)匹配到一组训练图像中&#xff0c;并基于立体渲染技术对新视图进…

nestjs版若依全栈管理后台完全开源!

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生&#xff0c;它的后端采用…

股票退市的最新要求!

五一假期一过&#xff0c;多家上市公司都进入退市名单&#xff0c;不知道有没有您的股票&#xff1f;很多朋友直呼现在炒股越来越难&#xff0c;一步小心就买到了退市个股&#xff0c;加上新改革&#xff0c;我们一起来结合退市政策来了解下怎么挑选个股&#xff1f; 2024年最新…

JAVA队列相关习题4

1. 用队列实现栈。 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 一个队列无法实现栈 尝试使用两个队列 1)push元素的时候应当放在那里&#xff1f;哪个队列不为空就放在哪里 2&#xff09;出栈的时候&#xff0c;出不为空的队列size-1元素&#xff0c;剩余元…

01-new SpringApplication

准备配置Bean Configuration public class TestSpringApplication {static class Bean1 {}static class Bean2 {}static class Bean3 {}Beanpublic Bean2 bean2() {return new Bean2();}Beanpublic TomcatServletWebServerFactory tomcatServletWebServerFactory() {return ne…

去哪找高清视频素材?哪个网站有视频素材?

在这个视觉表达日益重要的时代&#xff0c;获取高品质的视频素材变得尤为关键。4K和无水印视频素材特别受到创作者的青睐&#xff0c;因为它们能极大地提升视觉作品的吸引力和专业度。接下来&#xff0c;我将介绍几个国内外的优秀视频素材网站&#xff0c;助您在创作旅程上一帆…

解决springboot项目的网站静态页面显示不全问题

在通过springboot搭建项目时&#xff0c;为了能够访问静态的前端页面&#xff0c;我们考虑到访问的优先级问题&#xff0c;通常选择将资源放在recourses/static的目录下&#xff0c;如下&#xff1a; 这时可能会出现类似于下面这种图片无法加载、没有按照指定位置显示的情况&am…

代码随想录算法训练营第六十二天|503.下一个更大元素II、 42. 接雨水

单调栈 文章目录 一、下一个更大元素II二、接雨水总结 一、下一个更大元素II 1.数组扩展一倍计算 2.模拟遍历两边nums&#xff0c;用i % nums.size()来操作 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {//暴力解法&#x…

第四十节实现主人公的技能释放功能(二)实现技能按钮

看看我们今天要实现的效果是&#xff0c;当我们按下数字1快捷键&#xff0c;我们的技能按钮会进入倒计时&#xff0c;如下图演示&#xff1a; 一、新建场景和根节点设置 新建场景&#xff0c;选择TextureButton作为根节点&#xff0c;重名为SpellButton&#xff0c;保存场景…

程序员的实用神器——高效软件开发的秘诀

目录 前言 一、自动化测试工具 &#xff08;一&#xff09;常用的自动化测试工具 &#xff08;二&#xff09;编写有效的测试用例的建议 &#xff08;三&#xff09;提高代码覆盖率的方法 二、持续集成/持续部署 &#xff08;一&#xff09;持续集成&#xff08;CI&#…

前端面试题 | new 操作符的原理 |(对象的原型 及其用途)

问题&#xff1a;new操作符具体干了什么&#xff1f; 总结&#xff1a; 在JavaScript中&#xff0c;new操作符 用于创建一个新的对象实例。 作用是 ①创建一个空对象 ②将这个新对象的隐式原型指向构造函数的显式原型 ③它将构造函数的this指向这个新对象&#xff0c;并执行构造…

pyinstaller 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法(详细)

首先我们需要查看是否安装了pyinstaller &#xff0c;可以在命令窗口输入命令pip list检查是否安装成功&#xff0c; 这里我们可以看见已经安装成功了的&#xff0c;如果没有安装可以执行安装命令 pip install pyinstaller 进行安装即可。 下一步我们排查pyinstaller的安装路…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接&#xff0c;那么状态转移方程为&#xff1a; d p [ i ] t r u e &#xff0c;如果存在任意 j ∈ [ 0 , i − 1…

spring源码分析之AOP开启注解

AOP开启注解 在使用注解Aspect来进行AOP操作时&#xff0c;需要在xml中进行配置 <!-- 使Aspect注解生效 --><aop:aspectj-autoproxy/> 创建BeanFactory时obtainFreshBeanFactory()在解析xml加载BeanDefinition中&#xff0c;执行parseBeanDefinitions方法进行解析发…