滑动窗口解决子串问题

news2024/9/22 22:32:53

问题解析:

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

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

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

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

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

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

代码:

        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)只能采摘俩种水果,求采摘最多的水果数量,要求必须连续:

        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)找字符串中的所有异位词*******

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

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.coloradmin.cn/o/2071698.html

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

相关文章

17 深入理解 C 语言 main 函数:返回值意义、命令行参数接收、跨环境差异及CMD乱码解决

目录 1 main 主函数 2 main 函数的返回值 2.1 返回值的意义 2.2 默认返回值 2.3 返回值类型 3 main 函数的参数 3.1 参数内容 3.2 案例&#xff1a;循环遍历主函数的参数 3.3 不传递参数 3.4 powershell 环境下传参 3.5 cmd 环境下传参 3.6 解决 cmd 输出乱码问题 …

pytorch深度学习基础 7 (简单的线性拟合+检验模型在验证集上的效果)

我们之前做的目的都是评估训练的损失&#xff0c;训练的损失Loss告诉我们&#xff0c;我们的模型是否能够完全拟合训练集&#xff0c;也就是说我们的模型是否有足够的能力处理数据中的相关信息。但是我们之前都是评价训练的好坏&#xff0c;并没有引入验证集。接下来我们就需要…

Java基础——自学习使用(多态)

一、多态的定义 父类的引用指向子类的对象。 B继承A&#xff0c;A abnew B();——父类引用指向子类的对象。 二、创建对象了解多态的内部结构 &#xff08;1&#xff09;父类即A类对象的内存结构图 &#xff08;2&#xff09;子类即B类对象的内存结构图 由于B中重写了父类A中…

EazyDraw for Mac 矢量图绘制设计软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

SSRF和CSRF实战复现

文章目录 SSRFWeb-Hacking-Lab-master1、Centos未授权访问2、Ubuntu未授权访问3、Ubuntu传入公钥访问4、ssrf_redis_lab_pickle_redis_lab CSRF:windphp SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 f…

第三课《排序》

前言 排序是将一组数据&#xff0c;按照指定的顺序或要求来进行排列的过程。是数据结构相关课程和内容较为重要和核心的内容之一&#xff0c;常常作为考试题和面试题目来考察学生和面试者&#xff0c;因此熟练掌握经典的排序算法原理和代码实现是非常重要的 本文介绍了几大较为…

AJAX(5)——Promise

Promise Promise对象用于表示一个异步操作的最终完成或失败及其结果值 语法&#xff1a; //创建Promise对象const p new Promise((resolve, reject) > {//执行异步代码setTimeout(() > {// resolve(成功结果)reject(new Error(失败结果))}, 2000)})//获取结果p.then(r…

坚鹏讲人才第13期:个人数字化转型——个人与时代的共赢之选

坚鹏讲人才第13期&#xff1a;个人数字化转型——个人与时代的共赢之选 在这个日新月异的时代&#xff0c;数字化转型已经成为当今时代的必然趋势&#xff0c;它不仅改变了我们的生活方式&#xff0c;也正在改变着各行各业的运营模式。数字化时代&#xff0c;不仅需要数字化企…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

快9月了刚结束基础,武忠祥强化vs张宇18讲应该如何选择?

快9月了&#xff0c;最近有一部分同学刚结束基础&#xff0c;在后台提问&#xff1a;强化到底该学武忠祥还是张宇18讲&#xff1f;其实这个问题&#xff0c;如果你是6月份开始强化&#xff0c;很好回答&#xff0c;但是现在已经快9月份了&#xff0c;很多同学都开始做真题了&am…

代码随想录 刷题记录-16 贪心算法(1)贪心理论基础及习题

一、理论基础 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff09; 贪心算法并没有固定的套路。 所以唯一的难点就是如何通过局部最优&#xff0c;推出整体最优。 靠自己手动模拟&#xff0c…

深度学习 回归问题

1. 梯度下降算法 深度学习中, 梯度下降算法是是一种很重要的算法. 梯度下降算法与求极值的方法非常类似, 其核心思想是求解 x ′ x x′, 使得 x ′ x x′ 在取 x ⋆ x^{\star} x⋆ 时, 可以使得 l o s s 函数 loss函数 loss函数 的值最小. 其中, 在求解 x ′ x x′ 的过…

罗德与施瓦茨RS、UPV 音频分析仪 250KHZ 双通道分析仪UPL

罗德与施瓦茨 UPV 音频分析仪的规格包括&#xff1a; 模拟 双通道分析仪&#xff1a;带宽高达 250 kHz 生成正弦波信号&#xff1a;单通道最高 185 kHz&#xff08;需要 B1&#xff09;和双通道最高 80 kHz FFT本底噪声&#xff1a;< -140dB 固有频率响应&#xff08;20 …

链动 2+1 模式小程序 AI 智能名片商城源码培训邀约策略研究

摘要&#xff1a;本文深入剖析链动 21 模式小程序 AI 智能名片商城源码的培训邀约策略&#xff0c;从该源码的价值出发&#xff0c;阐述邀约的重要性&#xff0c;并详细介绍具体的邀约策略&#xff0c;旨在为相关培训活动提供切实可行的指导&#xff0c;提高邀约成功率&#xf…

前端如何快速切换node版本:nvm

安装之前最好卸载计算机已经安装的node&#xff08;通过Windows菜单找到Node.js的卸载程序&#xff0c;运行卸载程序&#xff09;。下载nvm安装包&#xff1a;nvm安装地址。安装nvm&#xff0c;选择nvm安装根路径指定nodejs的安装路径打开命令行&#xff0c;输入nvm -v 可查看版…

Object.create的原型继承

● 首先我们来从这种方法来创建一个和之前一样计算年龄的方法 const PersonProto {cacleAge() {console.log(2038 - birthYear);} };const zhangsan Object.create(PersonProto); console.log(zhangsan);● 发现确实可以实现原型继承的特性 const PersonProto {cacleAge()…

odoo17 group col 属性

odoo17 group col 属性 以前版本&#xff0c;col4,在17中不能用了&#xff0c;或者方法变了 <record id"hetong.addfj_wizard" model"ir.ui.view"><field name"name">合同附件</field><field name"model">het…

免费的大模型插件llm.nvim

llm.nvim&#xff08;https://github.com/StubbornVegeta/llm.nvim&#xff09;是一款基于cloudflare的免费大模型插件&#xff0c;你可以像使用ChatGPT一样和它进行对话 在使用这款插件之前&#xff0c;你需要注册cloudflare&#xff0c;获取你的account和API key。你可以在这…

RCE - - 无字母数字远程命令执行

题目源码 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析 这道题 code 接 get 传…

【Qt】常用控件QProgressBar

常用控件QProgressBar 使用QProgressBar表示一个进度条&#xff01;&#xff01;&#xff01; QProgressBar的核心属性 属性说明 minimum 进度条最⼩值 maximum 进度条最⼤值 value 进度条当前值 alignment ⽂本在进度条中的对⻬⽅式. Qt::AlignLeft : 左对⻬Qt::Alig…