算法思想总结:滑动窗口算法

news2025/1/12 21:46:54

                                                      创作不易,感谢三连 

一.长度最小的数组

. - 力扣(LeetCode)长度最小的数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) 
    {
           int len=INT_MAX,n=nums.size(),sum=0;//len必须要给一个很大的数,否则
           for(int left=0,right=0;right<n;++right)
           {
            sum+=nums[right];//right进窗口
            while(sum>=target)//符合条件后进行更新,然后出窗口
            {
                len=min(len,right-left+1);//更新长度
                sum-=nums[left++];
            }
           }
           return len==INT_MAX?0:len;
    }
};

 二.无重复字符的最长字串

. - 力扣(LeetCode)无字符的最长字串

class Solution {
public:
    int lengthOfLongestSubstring(string s) 
    {
        int hash[128]={};//计数
        int len=0, n=s.size();
        for(int left=0,right=0;right<n;++right)
        {
            ++hash[s[right]];//进窗口
            while(hash[s[right]]>1)  --hash[s[left++]];//出窗口
            len=max(len,right-left+1);//更新长度
        }
        return len;
    }
};

三.最大连续1的个数

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

class Solution {
public:
    int longestOnes(vector<int>& nums, int k)
    {
         int len=0;
         for(int left=0,right=0,zero=0;right<nums.size();++right)
            {
                if(nums[right]==0) ++zero;//进窗口
                while(zero>k) if(nums[left++]==0) --zero;//出窗口
                len=max(len,right-left+1); 
            }
            return len;
    }
};

 四.将x减到0的最小操作数

. - 力扣(LeetCode)将x减到0的最小操作数

class Solution {
public:
    int minOperations(vector<int>& nums, int x) 
    {//将问题转化为求一个最长子数组 其大小正好==sum-x
        int ret=-1;
        int sum=accumulate(nums.begin(),nums.end(),0);//计算数组的总和
        int target=sum-x;//记录目标值
        if(target<0) return -1;//细节处理
        for(int left=0,right=0,temp=0,n=nums.size();right<n;++right)
        {
            temp+=nums[right];//进窗口
            while(temp>target)  temp-=nums[left++];//出窗口
            if(temp==target)   ret=max(ret,right-left+1);//更新结果
        }
        return ret==-1?-1:nums.size()-ret;
    }
};

 五.水果成篮

. - 力扣(LeetCode)水果成篮

class Solution {
public:
    int totalFruit(vector<int>& fruits) 
    {
       int hash[100001]={0};
       int ret=0,n=fruits.size();
       for(int left=0,right=0,kinds=0;right<n;++right)
       {
           if(hash[fruits[right]]++==0) ++kinds;//进窗口
           while(kinds>2)  if(--hash[fruits[left++]]==0) --kinds;
           ret=max(ret,right-left+1);
       }
       return ret;
    }
};

六.找到字符串种所有字母异位词

. - 力扣(LeetCode)找到字符串种所有字母异位词

class Solution {
public:
    vector<int> findAnagrams(string s, string p) 
    {
        vector<int> ret;
        int hash1[26]={0};//用来统计p的元素个数
        for(char ch:p) ++hash1[ch-'a'];
        int hash2[26]={0};//用来统计滑动窗口的元素个数
        int m=p.size();
        for(int left=0,right=0,count=0;right<s.size();++right)//count用来记录有效字符的个数
           {
           if(++hash2[s[right]-'a']<=hash1[s[right]-'a'])  ++count;//进窗口的同时统计有效字符个数
            if(right-left+1>m)//判断  出窗口
            {
               if(hash2[s[left]-'a']--<=hash1[s[left]-'a'])  --count;
               ++left;
            }
            if(count==m) ret.push_back(left);
           }
           return ret;
    }
};

七.最小覆盖字串

. - 力扣(LeetCode)最小覆盖字串

class Solution {
public:
    string minWindow(string s, string t) 
    {
        int hash1[128]={0};//统计t字符串个元素的出现次数
        int kinds=0;//用来统计种类
        for(char ch:t) if(hash1[ch]++==0)  ++kinds;
        int hash2[128]={0};//统计s字符串中滑动窗口的元素出现次数
        int begin=-1,minlen=INT_MAX;//用来记录返回值情况
        for(int left=0,right=0,count=0;right<s.size();++right)
        {
            if(++hash2[s[right]]==hash1[s[right]])  ++count;//进窗口的同时统计窗口内元素种类
            while(count==kinds)//当种类都一样时,可以去更新结果
            {
                if(right-left+1<minlen)//因为还需要更新begin,所以不能直接用min
                {
                    minlen=right-left+1;
                    begin=left;
                }
                if(hash2[s[left]]--==hash1[s[left]]) --count;
                ++left;
            }
        }
         return begin==-1?"":s.substr(begin,minlen);
    }
};

八.滑动窗口总结

   当题目涉及到子串或者是子数组,都可以考虑到使用滑动窗口来进行解决

    但是有一个需要注意的地方就是如果涉及到窗口求和的话。要保证数都是正整数,否则就不满足单调性如下图这一题

涉及到不同的种类需要统计数量的时候,常常会用到哈希表!! (5-7题)

后面有类似题目会持续更新!! 

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

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

相关文章

【Linux】信号保存{sigset_t/sigpending/sigprocmask/bash脚本/代码演示}

文章目录 1.信号相关常见概念2.管理信号的数据结构3.初识sigset_t4.信号集操作函数4.1sigpending4.2sigprocmask4.2代码测试1.测试12.测试23.测试3 4.3bash 脚本文件 1.信号相关常见概念 信号相关动作&#xff1a;产生 发送 接收 阻塞 递达(处理) 实际执行信号的处理动作称为信…

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

面部表情参考图

创造表情形变 | Character Creator | Reallusion 皮笑肉不笑&#xff1f;读取情绪的AI说&#xff1a;我太难了_面部

HAProxy高性能负载均衡器

一、HAProxy基础知识 &#xff08;一&#xff09;HAProxy概述 HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器&#xff0c;它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡&#xff0c;还能应用于数据…

RabbitMQ学习总结-基础篇

1..RabbitMQ 本身是一个消息中间件&#xff0c;在服务应用中&#xff0c;可解决高性能&#xff0c;高并发&#xff0c;高应用的问题&#xff0c;极大程度上解决了应用的性能问题。 2.MQ的使用分为生产者和消费者&#xff0c;生产者生产消息&#xff0c;消费者去消费消息。 3.…

cesium.js加载模型后,重新设置旋转角度属性值

// 加载模型var position Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 计算矩阵var rollAngleDegrees 15; // 设置翻滚角度var rollAngleRadians Cesium.Math.toRadians(rollAngleDegrees); // 将角度转换为弧度var orientation Cesium.Transforms.eas…

android 怎么自定义view

首先了解view的绘制流程&#xff1a; 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout&#xff0c;确定子view 而onDraw----是继承view时候需要操作的。 所以&#xff1a;自定义ViewGroup一般是利用现有的组件根据特定的布局…

Python电梯楼层数字识别

程序示例精选 Python电梯楼层数字识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python电梯楼层数字识别》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

操作系统内功篇:硬件结构之如何写出让CPU执行更快的代码?

一 前言 因为CPU要操作的数据都在CPU Cache中的话&#xff0c;就不用再从内存中读取数据了&#xff0c;这样就提高了效率&#xff0c;访问的数据在CPU Cache中越多&#xff0c;有个专业名词称为缓存命中率高&#xff0c;所以说&#xff0c;缓存命中率越高&#xff0c;自然执行…

Jupyter Notebook出错提示An error occurred while retrieving package information解决办法

出错日志信息&#xff1a; To access the notebook, open this file in a browser:file:///C:/Users/colda/AppData/Roaming/jupyter/runtime/nbserver-14564-open.htmlOr copy and paste one of these URLs:http://localhost:8888/?token3c0113e5da07c0b8b8c9de74ffb453c5047…

在idea中配置tomcat服务器,然后部署一个项日

1.下载tomcat Tomcat下载 点击右边的tomcat8 找到zip点击下载 下载完&#xff0c;解压到你想放置的路径下 2.配置环境变量 打开设置找到高级系统设置点击环境变量 点击新建&#xff0c;变量名输入&#xff1a;CATALINA_HOME&#xff0c;变量值就是Tomcat的安装路径&#x…

机器人阻抗控制中的transparency(透明度)

在机器人控制领域&#xff0c;transparency&#xff08;透明性&#xff09;是一个描述机器人在物理交互过程中如何响应外部力或运动的术语。透明性在这里通常意味着机器人的运动和行为对于与其交互的用户或环境来说是直观且可预测的。换句话说&#xff0c;透明性意味着机器人的…

【二分查找详细解析】 【图解】 例题【洛谷P2249 【深基13.例1】查找】

文章目录 二分查找的基础解释例题【洛谷P2249 【深基13.例1】查找】code↓ 二分查找的基础解释 二分的时间复杂度为 O ( l o g n ) O(log n) O(logn)&#xff0c;进行二分查找的序列必须满足单调性 我们可以先定义两个值 l , r l,r l,r &#xff0c;来表示查找到的左端点 l…

接口与多态

通过接口实现多态 接口中声明若干个 bstract方法&#xff1b; 方法体的内容细节由实现接口的类去完成&#xff0c;不同的类有 不同的实现方式 → 则接口变量在回调接口方法时具有多 种形态。 用接口进行程序设计的核心思想 使用接口回调技术&#xff1a;接口变量存放实现该接口…

DP最长上升子序列模型

目录 怪盗基德的滑翔翼代码实现 登山代码实现 合唱队形代码实现 友好城市问题分析代码实现 最大上升子序列和代码实现 *拦截导弹问题分析代码实现扩展 *导弹防御系统问题分析代码实现 *最长公共上升子序列问题分析代码实现 LIS 问题一般有三种解法 朴素版动态规划贪心二分树状…

测试用例要如何写

1、测试点与测试用例 测试点不等于测试用例&#xff0c;这是我们首先需要认识到的。 问题1&#xff1a;这些测试点在内容上有重复&#xff0c;存在冗余。 问题2&#xff1a;一些测试点的测试输入不明确&#xff0c;不知道测试时要测试哪些。 问题3&#xff1a;总是在搭相似…

树与二叉树(数据结构)

本篇博客讲解 树与二叉树&#xff0c;后续会继续讲解堆 —————————————————————— 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看…

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题,报错

CMAKE_CUDA_ARCHITECTURES set to ‘native’多版本与版本号矛盾问题&#xff0c;报错 1. 报错提醒如下图2. 原因本地安装多个cuda版本导致native寻找到多个版本&#xff0c;导致报错3. 具体配置需要根据你的显卡型号来确认 1. 报错提醒如下图 2. 原因本地安装多个cuda版本导致…

Redis - String 字符串

前言 下表中包含本博客提到的所有命令 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a; 1&#xff09;⾸先 Redis 中所有的键&#xff08;key&#xff09;的类型都是字符串类型&#xff0c;⽽且其他⼏种数据结构也都是在字符串类似基础上…

ffmpeg 滤镜实现不同采样率多音频混音

音频混音在音视频开发中是十分重要的一个环节,所谓音频混音就是将所有需要混音的数据相加得到混音数据,然后通过某个算法进行非法数据的处理;例如相加数值超过最大值,最小值等! 在实际的音频开发中,要实现混音的流程如下: 因此我们的编码实现就分为五部分:寻找…