滑动窗口解决子串问题

devtools/2024/9/24 0:58:23/

问题解析:

以这道题为例子:. - 力扣(LeetCode)找长度最小的子数组,子数组和必须大于条件中的target

暴力解法:左右指针列举出每一种子数组的可能,每种可能去求子数组的和,找到最小的子数组。

时间复杂度:On3       左右指针枚举出所有的子数组需要On2的复杂度,再去求每个子数组组的和,总计为On3的复杂度。

暴力枚举的进阶:利用单调性:左指针在最外层循环从左到右进行遍历,右指针每次从左指针开始求和计算找到第一次满足target的子数组,这个数组就是当前左指针下最短数组(单调性)。左指针遍历完数组就能拿到长度最小的子串。

时间复杂度:On2.      不需要通过左右指针去列举出所有的子数组了。只需要左指针进行遍历,然后在左指针的节点从左到右求和即可。

进阶:滑动窗口解决:计算完以当前起始位置的最小子数组后左指针右移时,右指针不用从左指针的位置开始重新计算和了,直接将左指针右移前的和减去左指针原来的位置就可以得到当前子数组的和,直接进行判断,小于target右指针右移、大于target直接记录当前子数组。(也是利用单调性,因为左指针右移,此时子数组的和是缩减的,那么右指针要么不动就可以满足要么需要右移,不可能往左)。

代码:

java">        int sum = 0;int minLn = Integer.MAX_VALUE;int left = 0 , right = 0;while(right < nums.length) {sum += nums[right ++]; //进窗口while(sum >= target)  { //判断minLn = Math.min(minLn , right - left); //更新结果sum -= nums[left ++];//出窗口}}return minLn == Integer.MAX_VALUE ? 0 : minLn;

题目:

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

. - 力扣(LeetCode)最大连续1的个数。****

*****. - 力扣(LeetCode)在数组的前后取值将目标数减到0的最小步数。

题目要求从数组前面或者后面进行操作得到最小步数,俩段是不连续的,但是我们可以将这个问题进行转换数组是固定的,数组和是固定的,你从俩边去最少的和固定的数,此时中间连续一段子数组的和也是固定的且是最长的。

怎么求中间子数组要满足的和的值:数组总和减去目标数。

此时就可以使用我们的滑动窗口计算出中间这段子数组的长度进而求出俩边的长度。

. - 力扣(LeetCode)只能采摘俩种水果,求采摘最多的水果数量,要求必须连续:

java">        int[] kinds = new int[fruits.length];//下标表示水果种类,值表示对应水果数量int kind = 0;//已经采摘的水果种类int left = 0;int right = 0;int maxLen = 0; //最大长度即水果数量while(right < fruits.length) {kinds[fruits[right]] ++;if(kinds[fruits[right]] == 1) kind ++;//如果加之后的值是1说明采摘了新种类while(kind > 2) {kinds[fruits[left]] --;if(kinds[fruits[left]] == 0) kind --;left ++;}maxLen = Math.max(right- left + 1 , maxLen);right ++;}return maxLen;

. - 力扣(LeetCode)找字符串中的所有异位词*******

通过异位词的长度来维护这个窗口。同时维护一个有效字母数量用来确定当前字串是否满足异位词要求。

java">public List<Integer> findAnagrams(String s, String p) {//建立p的哈希int[] model = new int[26];for(int i= 0;i < p.length();i ++) {model[p.charAt(i) - 97] ++;}int[] hash = new int[26];int left = 0;int right = 0;List<Integer> list = new LinkedList<>();int integalCount = 0;//合法字符数量while(right < s.length()) {//只有model中存在且值大于hash中的值时合法字符数量+1,这样当合法字符数量等于p长度时即为目标子串hash[s.charAt(right) - 97] ++;if(hash[s.charAt(right) - 97] <= model[s.charAt(right) - 97]) {integalCount ++;}if(right - left + 1 > p.length()) {hash[s.charAt(left) - 97] --;if(hash[s.charAt(left) - 97] < model[s.charAt(left) - 97]) {integalCount --;}left ++;}if(integalCount == p.length()) list.add(left);right ++;}return list;}


http://www.ppmy.cn/devtools/99728.html

相关文章

Datawhale AI夏令营

一、分析CV识别任务 任务分析 自己研究生期间做过的大多是无监督任务&#xff0c;监督任务做的很少。比如&#xff0c;之前用过yolov5做过滑动验证码的识别&#xff0c;给滑动验证码的缺口打标签是项耗时费力的工作。本次任务相同&#xff0c;是给非机动车、机动车打标签。 fr…

【非常简单】 猿人学web第一届 第13题 入门级 cookie

查看数据接口 https://match.yuanrenxue.cn/api/match/13 请求参数只携带了 page 页码 请求时需要携带 cookie yuanrenxue_cookie字段 在请求的时将 cookie 中对应的 yuanrenxue_cookie 字段删除 勾选事件监听断点中的脚本断点后刷新页面即可看到 cookie 生成的位置 这段…

BLE mesh model 汇总

Ble Mesh Model Summary mesh model简介 Bluetooth Mesh 模型&#xff08;Mesh Model&#xff09;是 Bluetooth Mesh 网络中的一种抽象概念&#xff0c;用于定义设备的行为、功能和交互方式。在 Bluetooth Mesh 网络中&#xff0c;模型是节点&#xff08;Node&#xff09;上的…

密码学之哈希算法

文章目录 1. 哈希函数概述1.1 哈希函数的定义1.2 哈希函数的重要性 2. SHA系列算法简介2.1 SHA系列的发展历史2.2 SHA系列的应用场景 3. 主要SHA算法详解3.1 MD5算法3.2 SHA-1算法3.3 SHA-2算法家族3.4 SHA-3算法 4. SHA算法的安全性分析4.1 安全性的重要性4.2 已知的攻击方法4…

对equals()和hashCode()的理解?

equals() 和 hashCode() 是 Java 中用于对象比较和存储的两个重要方法。在使用集合&#xff08;如 HashMap, HashSet, Hashtable 等&#xff09;时&#xff0c;这两个方法尤其重要。让我们逐一了解这两个方法的概念和它们之间的关系。 1. equals() 方法 定义&#xff1a;equal…

贪心算法-分数背包问题

贪心算法与分数背包问题详解 目录 贪心算法与分数背包问题详解贪心算法简介分数背包问题问题分析算法步骤流程图代码实现&#xff08;C&#xff09;总结 C学习资源 贪心算法简介 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择&#xff0c;从而希望导致结果…

web 3D可视化技术

一.介绍 web 3D可视化技术的发展与应用展开&#xff0c;学习web 3D技术&#xff0c;包括利用js库进行项目搭建&#xff0c;学习图形学知识&#xff0c;掌握web 3D基础概念如点、线、面等&#xff0c;以及深入探讨渲染技术如PBR&#xff0c;材质贴图和环境光等。内容还涉及了与…

Compose(7)交互和动画

在 Jetpack Compose 中&#xff0c;交互和动画是提升用户体验的重要手段。 一、交互 1.点击事件 使用 Button 组件时&#xff0c;可以通过 onClick 参数来处理点击事件。 例如&#xff1a; Composablefun ClickableButton() {Button(onClick {// 处理点击事件的逻辑}) {Te…