专题二:滑动窗口【优选算法】

news2024/11/18 20:02:10

滑动窗口:

什么时候用? 同向双指针(找单调性)

怎么用?

1)用left、right指针维护窗口

2)进窗口(right指针++,更新窗口内的值)

3)判断

        出窗口(left++,并更新窗口内的值)

4)更新结果(注意每道题更新结果的时机不同,需具体分析)

目录

滑动窗口:

1、长度最小的子数组

2、无重复字符的最长子串

3、最大连续1的个数 

4、将x减到0的最小操作数

5、水果成篮

 6、找到字符串中所有字母异位词

7、串联所有单词的子串(容器的使用)

8、最小覆盖子串 


1、长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int sum = 0,len = INT_MAX;
        for(int l = 0,r = 0;r < n;r++){
            sum += nums[r];//入窗口
            while(sum >= target)//判断
            {
                len = min(len,r - l + 1);//更新结果
                sum -= nums[l++];//出窗口
            }
        }    
        return len == INT_MAX?0:len;    
    }
};

2、无重复字符的最长子串

 暴力解法,枚举每一个字串,但分析可发现,出现重复字符时,left可直接跳到重复字符,right也无需往回走。因此就是同向双指针,也就是滑动窗口。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        vector<int> hash(128);//用来判断字符是否出现过
        int len = 0,n = s.size();
        for(int l = 0,r = 0;r < n;r++){//进窗口
            hash[s[r]]++;
            while(hash[s[r]] > 1)//判断
            {
                hash[s[l]]--;//出窗口
                l++;
            }
            len = max(len,r-l+1);//更新结果
        }
        return len;
    }
};

3、最大连续1的个数 

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size();
        int count = 0;
        int ret = 0;
        for(int left = 0,right = 0;right < n;right++){//进窗口
            if(nums[right] == 0) count++;
            while(count > k)//判断
                if(nums[left++] == 0)count--;//出窗口
            ret = max(ret,right-left+1);//更新结果
        }
        return ret;
    }
};

4、将x减到0的最小操作数

 

通过正难则反,可以将此题转换成类似第一题 

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int n = nums.size();
        int sum = 0;
        for(auto x : nums){
            sum += x;
        }
        int target = sum - x;

        if(target < 0) return -1;
        int ret = -1,sum2 = 0;
        for(int left = 0,right = 0;right < n;right++){
            sum2 += nums[right];
            while(sum2 > target) sum2 -= nums[left++];
            if(sum2 == target) ret = max(ret,right - left + 1);
        }
        return ret == -1?-1:n - ret;
    }
};

5、水果成篮

 unordered_map版

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        unordered_map<int,int> hash;
        int n = fruits.size();
        int kind = 0,ret = 0;
        for(int left = 0,right= 0;right < n;right++){
            hash[fruits[right]]++;

            while(hash.size() > 2)
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]] == 0) hash.erase(fruits[left]);
                left++;
            }
            ret = max(ret,right - left + 1);
        }
        return ret;
    }
};

数组版: 

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int hash[100010] = {0};
        int n = fruits.size();
        int kind = 0,ret = 0;
        for(int left = 0,right= 0;right < n;right++){
            if(hash[fruits[right]] == 0) kind++;
            hash[fruits[right]]++;

            while(kind > 2)
            {
                hash[fruits[left]]--;
                if(hash[fruits[left]] == 0) kind--;
                left++;
            }
            ret = max(ret,right - left + 1);
        }
        return ret;
    }
};

 6、找到字符串中所有字母异位词

check的优化: 

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int hashp[265] = {0};
        for(auto x : p) hashp[x]++;
        int count = 0;
        vector<int> ret;
        int hashs[256] = {0};
        for(int l = 0,r = 0;r < s.size();r++){
            hashs[s[r]]++;
            if(hashs[s[r]] <= hashp[s[r]]) count++;
            if(r - l + 1 > p.size())
            {
                if(hashs[s[l]] <= hashp[s[l]]) count--;
                hashs[s[l]]--;
                l++;
            }
            if(count == p.size()) ret.push_back(l);
        }
        return ret;
    }
};

7、串联所有单词的子串(容器的使用)

 

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        unordered_map<string,int> hash1;
        vector<int> ret;
        for(auto& s:words){
            hash1[s]++;
        }
        int len = words[0].size(),m = words.size();
        for(int i = 0;i < len;i++){
            unordered_map<string,int> hash2;
            for(int left = i,right = i,count= 0; right + len <= s.size();right += len){
                //进窗口+维护count
                string in = s.substr(right,len);
                hash2[in]++;
                if(hash2[in] <= hash1[in]) count++;
                //判断
                if(right - left + 1 > len * m) 
                {
                    //出窗口+维护count
                    string out = s.substr(left,len);
                    if(hash2[out] <= hash1[out]) count--;   
                    hash2[out]--;
                    left += len;
                }
                //更新结果
                if(count == m) ret.push_back(left);
            }
        }
        return ret;
    }
};

8、最小覆盖子串 

 

class Solution {
public:
    string minWindow(string s, string t) {
        int hash1[128] = {0};
        int kinds = 0;//统计有效字符种类数

        for(auto ch : t) 
        {
            if(hash1[ch] == 0) kinds++;
            hash1[ch]++;
        }
        int hash2[128] = {0};

        int minlen = INT_MAX,begin = -1;

        for(int left = 0,right = 0,count = 0;right < s.size();right++){
            //进窗口
            char in = s[right];
            hash2[in]++;
            if(hash2[in] == hash1[in]) count++;
            while(count == kinds)
            {
                if(right - left+1 < minlen)
                {
                    minlen = right - left + 1;
                    begin = left;
                }
                char out = s[left++];
                if(hash2[out] == hash1[out]) count--;
                hash2[out]--;
            }
        }
        if(begin == -1) return "";
        else return s.substr(begin,minlen);
    }
};

 

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

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

相关文章

LeetCode13——罗马数字转整数

解题思想&#xff1a; 前后指针 左边比右边小 做减法 左边比右边大 做加法 最后一个数字直接加。 package keepcoding.leetcode.leetcode13;public class Result02 {public static void main(String[] args) {int result romanToInt("XIV");System.out.println(re…

基于springboot实现java学习平台项目【项目源码+论文说明】

基于springboot实现java学习平台演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具…

链表收尾(8.2)

例题解析 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 1.拷贝节点插入原节点的后面&#xff08;核心&#xff09; 这样做的目的是方便找 random 节点&#xff0c;知道原节点可以找 random&#xff0c;知道上一个 random 可以找下一个 random 。 struct Node…

四、基本组件

1. Designer设计师 Designer程序是Qt官方推出的专为设计人员使用的UI设计工具&#xff0c;程序员可以使用此工具大幅降低UI设计的代码量。 Designer设计文件的格式是.ui&#xff0c;需要配合同名的头文件与源文件使用。.ui文件通常被称为界面文件&#xff0c;其内部是xml语法的…

(2023|ICML,LLM,标记掩蔽,并行解码)Muse:使用掩蔽生成 Transformer 的文本到图像生成

Muse: Text-To-Image Generation via Masked Generative Transformers 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 模型 2.1. 预训练文本编码器 2.2. 使用 V…

RabbitMQ队列及交换机的使用

目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖 3、生产者配置文件 4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消…

Power BI 傻瓜入门 2. Power BI的人员、方式和内容

本章内容包括&#xff1a; 识别潜在的企业Power BI用户使用Power BI解决数据生命周期问题区分使用Power BI生产的分析产品的类型 企业商业智能&#xff08;BI&#xff09;解决方案并非一刀切&#xff0c;这就是为什么像微软这样的供应商在Power BI利基市场的产品营销和分销中…

unity NPR 卡通渲染

文章目录 一、 介绍二、 素材准备三、 步骤四、 shader代码五、工程链接 一、 介绍 NPR是计算机图形学中的一类&#xff0c;即非真实感绘制(Non-photorealistic rendering)&#xff0c;主要用于模拟艺术式的绘制风格&#xff0c;也用于发展新绘制风格&#xff0c;形式一般是卡…

零基础Linux_20(进程信号)内核态和用户态+处理信号+不可重入函数+volatile

目录 1. 内核态和用户态 1.1 内核态和用户态概念 1.2 内核态和用户态转化 2. 处理信号 2.2 捕捉信号 2.2 系统调用sigaction 3. 不可重入函数 4. volatile关键字 5. SIGCHLD信号&#xff08;了解&#xff09; 6. 笔试选择题 答案及解析 本篇完。 1. 内核态和用户态…

气象台使用vr模拟仿真实训教学降低成本投入

气候仿真实验室用于模拟高低温、高湿、干燥、阳光光照、降雨、降雪、覆冰、雾天与强风等多种环境适应性试验等气候和环境条件&#xff0c;在环境试验中&#xff0c;温度、湿度、光照、降雨这些常见的仿真环境都很容易实现。而比较少见的雾天、强风、降雪等环境就比较难。因此为…

《动手学深度学习 Pytorch版》 9.8 束搜索

本节将介绍几大&#xff1a; 贪心搜索&#xff08;greedy search&#xff09;策略 穷举搜索&#xff08;exhaustive search&#xff09; 束搜索&#xff08;beam search&#xff09; 9.8.1 贪心搜索 贪心搜索已用于上一节的序列预测。对于输出序列的每一时间步 t ′ t t′…

【FPGA零基础学习之旅#16】嵌入式块RAM-双口ram的使用

&#x1f389;欢迎来到FPGA专栏~双口ram的使用 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

SystemVerilog学习(3)——数组

一、定宽数组 相比于Verilog-1995中的一维定宽数组&#xff0c;SV提供了更加多样的数组类型&#xff0c;功能上也大大增强。 1.1 定宽数组的声明与初始化 Verliog要求在声明中必须给出数组的上下界。因为几乎所有的数组都使用0作为索引下届&#xff0c;所以SV允许只给出数组的…

UART、SPI、I2C通信协议超全入门教程

本文引注: https://mp.weixin.qq.com/s/lVWK8xlDt7cOLi8WHYSuPg 1.SPI协议 1.基础 2.简介 3.工作原理 4.SPI数据传输步骤与优缺点 2.UART协议

抖音同城榜:探索城市新潮流

随着科技的飞速发展&#xff0c;短视频已经成为了人们日常生活中不可或缺的一部分。作为短视频领域的佼佼者&#xff0c;抖音一直致力于为用户带来更丰富、更有趣的短视频内容。抖音同城榜应运而生&#xff0c;成为了最新、最热门的话题聚集地&#xff0c;吸引了大量潮流达人和…

Java SSL/TLS证书认证逻辑

前言 最近做项目使用httpclient转发https请求&#xff0c;但是遇到一些坑&#xff0c;尤其是证书的认证&#xff0c;证书认证一般都是单向的&#xff0c;除非相互访问&#xff0c;证书一般基于host&#xff0c;但是如果访问需要ip&#xff0c;那么JDK默认的认证就会不通过&…

Unity⭐️Win和Mac安卓打包环境配置

文章目录 🟥 配置Android SDK1️⃣ 配置 SDK Platforms2️⃣ 配置 SDK Tools🎁 Android SDK Build-Tools🎁 Android SDK Command-line Tools(latest)🎁 Android SDK Tools(Obsolete)🟧 配置NDK🟩 配置JDK前情提示: 此方法适用于Windows/Mac 在配置时注意开启 🪜 …

shell变量之学习笔记

shell变量之学习笔记 Shell变量概念1 shell变量分类&#xff1a;2 变量的赋值3 变量赋值格式&#xff1a;4 变量命名方式5 变量声明6 变量引用7 变量清除8 变量只读9 内部参数变量10 位置参数变量11 退出和返回状态12 命令替换13 read命令14 字符串长度与截取15 字符串替换16 变…

FL studio21永久激活码 附带一键下载安装包

玩音乐的朋友&#xff0c;对FL studio肯定不陌生&#xff0c;目前最新的版本是FL studio21&#xff0c;这是一款非常强大且专业的音频制作软件&#xff0c;而且还可以编曲、剪辑、录音、混音等等之类的创作操作&#xff0c;使你的计算机成为一个全功能录音室。下面小编就来和大…

15.Tensor Product vs. Kronecker Product

此处是为澄清她两的区别&#xff0c; 这两个事物 都用的相同的符号表示&#xff0c; 即这个圈数符号&#xff0c; 它在数学中有许多不同的含义&#xff0c; 本文讨论的是&#xff1a;“张量积”&#xff0c;它是对张量的运算&#xff1b; 以及“Kronecker ”积&#xff0c;…