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

【算法】滑动窗口题单——3.不定长滑动窗口(求最短/最小)⭐ 删除最短的子数组使剩余数组有序

文章目录

  • 209. 长度最小的子数组
    • O(n)滑动窗口
    • O(nlogn) 前缀和+二分查找
  • 1234. 替换子串得到平衡字符串
  • 1574. 删除最短的子数组使剩余数组有序⭐
    • 枚举左端点,移动右端点
    • 枚举右端点,移动左端点
  • 76. 最小覆盖子串

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

209. 长度最小的子数组

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

在这里插入图片描述

提示:

1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5

进阶:

如果你已经实现 O(n) 时间复杂度的解法, 请尝试设计一个 O(n log(n)) 时间复杂度的解法。

O(n)滑动窗口

class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length, ans = n + 1, s = 0;for (int l = 0, r = 0; r < n; ++r) {s += nums[r];while (s - nums[l] >= target) s -= nums[l++];if (s >= target) ans = Math.min(ans, r - l + 1);}return ans == n + 1? 0: ans;}
}

O(nlogn) 前缀和+二分查找

枚举左端点,二分查找右端点。

class Solution {public int minSubArrayLen(int target, int[] nums) {int n = nums.length, ans = n + 1;int[] s = new int[n + 1];for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + nums[i - 1];for (int i = 0; i < n; ++i) {int l = i, r = n, t = target + s[i];while (l < r) {int mid = l + r >> 1;if (s[mid] >= t) r = mid;else l = mid + 1;}if (s[l] >= t) ans = Math.min(ans, l - i);}return ans == n + 1? 0: ans;}
}

1234. 替换子串得到平衡字符串

https://leetcode.cn/problems/replace-the-substring-for-balanced-string/description/

在这里插入图片描述

提示:

1 <= s.length <= 10^5
s.length 是 4 的倍数
s 中只含有 'Q', 'W', 'E', 'R' 四种字符

需要满足的条件是窗口外的各个元素的数量都<=n/4,这样就可以完成替换。

class Solution {public int balancedString(String s) {int n = s.length(), ans = n;int[] cnt = new int[128];for (char ch: s.toCharArray()) cnt[ch]++;for (int l = 0, r = 0; l < n; ++l) {while (!check(cnt, n / 4) && r < n) --cnt[s.charAt(r++)];if (check(cnt, n / 4)) ans = Math.min(ans, r - l);++cnt[s.charAt(l)];}return ans;}public boolean check(int[] cnt, int x) {return cnt['Q'] <= x && cnt['W'] <= x && cnt['E'] <= x && cnt['R'] <= x;}
}

1574. 删除最短的子数组使剩余数组有序⭐

https://leetcode.cn/problems/shortest-subarray-to-be-removed-to-make-array-sorted/description/

在这里插入图片描述

提示:

1 <= arr.length <= 10^5
0 <= arr[i] <= 10^9

定义好 l 和 r 的含义,分别是第一个非递减子数组的结束位置和第二个非递减子数组的开始位置,而不是中间被删除的子数组的两端。

枚举左端点,移动右端点

class Solution {public int findLengthOfShortestSubarray(int[] arr) {int n = arr.length, r = n - 1;      // r表示下一个非递减数组的开始位置while (r > 0 && arr[r - 1] <= arr[r]) r--;if (r == 0) return 0;int ans = r;// l表示第一个非递减数组的结束位置for (int l = 0; l == 0 || arr[l - 1] <= arr[l]; ++l) {while (r < n && arr[r] < arr[l]) ++r;ans = Math.min(ans, r - l - 1);}return ans;}
}

枚举右端点,移动左端点

class Solution {public int findLengthOfShortestSubarray(int[] arr) {int n = arr.length, l = 0;      // l表示第一个非递减数组的结束位置while (l + 1 < n && arr[l + 1] >= arr[l]) l++;if (l == n - 1) return 0;int ans = n - l - 1;// r表示下一个非递减数组的开始位置for (int r = n - 1; r == n - 1 || arr[r] <= arr[r + 1]; --r) {while (l >= 0 && arr[l] > arr[r]) l--;ans = Math.min(ans, r - l - 1);}return ans;}
}

76. 最小覆盖子串

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

在这里插入图片描述

提示:

m == s.length
n == t.length
1 <= m, n <= 10^5
s 和 t 由英文字母组成

进阶:你能设计一个在 o(m+n) 时间内解决此问题的算法吗?

维护窗口中的字符出现数量。
枚举右端点,根据条件收缩左端点即可。

class Solution {int[] cnt1 = new int[128], cnt2 = new int[128];public String minWindow(String s, String t) {for (char ch: t.toCharArray()) cnt2[ch]++;String ans = "";int mnL = s.length() + 1;for (int l = 0, r = 0; r < s.length(); ++r) {cnt1[s.charAt(r)]++;while (l < r && cnt1[s.charAt(l)] > cnt2[s.charAt(l)]) cnt1[s.charAt(l++)]--;if (check() && mnL > r - l + 1) {mnL = r - l + 1;ans = s.substring(l, r + 1);}}return ans;}public boolean check() {for (int i = 0; i < 128; ++i) {if (cnt1[i] < cnt2[i]) return false;}return true;}
}

相关文章:

  • unity button移动位置some values driven by canvas
  • Qt篇——子控件QLayoutItem与实际控件的强转
  • 网络通信 | 内网穿透
  • 2023年Flutter教程_Flutter+Getx仿小米商城项目实战视频教程-V3版
  • Flutter extended_image库设置内存缓存区大小与缓存图片数
  • 深入理解NLP
  • 基于单片机的空气质量检测系统
  • 接口测试 —— Requests库GET请求!
  • order by数据过多引起的cpu飙升
  • Web:探索 SpreadJS强大的在线电子表格库
  • 云原生之深入解析如何合并多个kubeconfig文件
  • Linux下protobuf和 protobuf-c安装使用
  • IP地址与代理ip在网络安全中的关键作用
  • Autojs 利用OpenCV识别棋子之天天象棋你马没了
  • Spigot 通过 BuildTools 构建 MineCraft Spigot 官方服务端文件
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • (三)从jvm层面了解线程的启动和停止
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Joomla 2.x, 3.x useful code cheatsheet
  • MySQL几个简单SQL的优化
  • Netty源码解析1-Buffer
  • React16时代,该用什么姿势写 React ?
  • Web Storage相关
  • 成为一名优秀的Developer的书单
  • 多线程事务回滚
  • 飞驰在Mesos的涡轮引擎上
  • 工程优化暨babel升级小记
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • zabbix3.2监控linux磁盘IO
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #单片机(TB6600驱动42步进电机)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 事件模型教程(二)
  • .net快速开发框架源码分享
  • .sh
  • [ C++ ] 继承
  • []sim300 GPRS数据收发程序
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [c]扫雷
  • [C++]类和对象(中)
  • [hdu 1711] Number Sequence [kmp]
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx
  • [JavaEE] 线程与进程的区别详解
  • [leetcode]Search a 2D Matrix @ Python
  • [Linux] 常用命令--版本信息/关机重启/目录/文件操作
  • [Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法
  • [MySQL FAQ]系列 -- 账号密码包含反斜线时怎么办
  • [one_demo_13]ArrayList去除重复的元素
  • [python] os.path说明
  • [Python学习笔记]Requests性能优化之Session