算法综合篇专题二:滑动窗口

news2024/9/22 21:35:28

 “在混沌想法中,最不可理喻念头。”


1、长度最小的子数组

(1) 题目解析        

(2) 算法原理        

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


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

(1) 题目解析          

(2) 算法原理 

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        int hashtable[128] = {0};
        int len = 0;
        for(int left=0,right=0;right<n;++right)
        {
            //1.入窗口:进入哈希表
            hashtable[s[right]]++;
            // 2.判断:出现重复字符
            while(hashtable[s[right]] > 1) 
                // 3.出窗口:过滤冲突字符
                hashtable[s[left++]]--;
            // 4.更新长度
            len = max(len,right-left+1);
        }
        return len;
    }
};


3、最大连续1的个数Ⅲ

(1) 题目解析        

(2) 算法原理 

        

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n = nums.size();
        int max_num = 0;
        for(int left=0,right=0,count=0;right<n;++right)
        {
            // 1.入窗口 对0做特殊处理
            if(nums[right] == 0) count++;

            // 2.判断:0的个数多了
            while(count > k){
                // 3. 出窗口:让left指向第一个遇到0位置的下一个
                if(nums[left++] == 0) count--;
            }
            // 4.更新结果
            max_num = max(max_num,right - left + 1);
        }
        return max_num;
    }
};

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

(1) 题目解析        

(2) 算法原理    

class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int n = nums.size();
        int sum = 0;
        for(auto& e:nums) sum+=e;
        int tar = sum - x;
        if(tar < 0) return -1;

        int tmp = 0;
        int op_num = -1;
        for(int left=0,right=0;right<n;++right)
        {
            // 1.入窗口
            tmp += nums[right];
            // 2.判断
            while(tmp > tar)
                // 4.出窗口
                tmp -= nums[left++];
            // 3.结果更新
            if(tmp == tar) op_num = max(op_num,right-left+1);
        }

        if(op_num == -1) return -1;
        else return n - op_num;
    }
};


5、水果成篮

(1) 题目解析        

(2) 算法原理        

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

            // 2.判断
            while(hash.size() > 2)
            {
                // 4.出窗口
                int out = fruits[left];
                hash[out]--;
                // 移除
                if(hash[out] == 0) hash.erase(out);
                left++;
            }
            // 3.更新结果
            ret = max(ret,right-left+1);
        }
        return ret;
    }
};

优化:        

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int hashtable[100001] = {0};
        int n = fruits.size();
        int ret = 0;
        // kinds:记录[left,right]种类数
        for(int left=0,right=0,kinds=0;right<n;++right)
        {
            // 1.入窗口 && 维护kinds
            if(hashtable[fruits[right]] == 0) kinds++;
            hashtable[fruits[right]]++;

            // 2.判断
            while(kinds > 2)
            {
                // 4.出窗口
                hashtable[fruits[left]]--;
                // 移除
                if(hashtable[fruits[left]] == 0) kinds--;
                left++;
            }
            // 3.更新结果
            ret = max(ret,right-left+1);
        }
        return ret;
    }
};


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

(1) 题目解析

(2) 算法原理        

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> res;
        int hash1[26] = {0};
        for(auto& 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)
        {
            char in = s[right];
            if(++hash2[in-'a'] <= hash1[in-'a']) count++;

            if(right-left+1>m)
            {
                char out = s[left++];
                if(hash2[out-'a']-- <= hash1[out-'a']) count--;
            }

            if(count == m) res.push_back(left);
        }
        return res;
    }
};


7、串联所有单词的子串

(1) 题目解析        

         进行这样的转换,这道题难道不像上一题的异位词?所以,我们是采用上一题的实现这一题的解法。

(2) 算法原理        

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        int n = s.size();
        int len = words[0].size(); // 步长
        int m = words.size(); // 长度
        
        unordered_map<string,int> hash1;
        for(auto& str:words) hash1[str]++;

        vector<int> res;
        for(int i=0;i<len;++i)
        {
            // 维护单词滑动窗口
            unordered_map<string,int> hash2;
            // right+len 处理边界问题
            for(int left=i,right=i,count=0;right + len <= n;right+=len)
            {
                // 1.入窗口:向后移动len
                string in = s.substr(right,len);
                hash2[in]++;
                if(hash1.count(in) && hash1[in] >= hash2[in]) count++; //有效字符

                // 2.判断
                if(right - left + 1 > len * m) //
                {
                    // 3.出窗口
                    string out = s.substr(left,len);
                    if(hash1.count(out) && hash1[out] >= hash2[out]) count--;
                    hash2[out]--;
                    left += len;
                }

                if(count == m) res.push_back(left);
            }
        }
        return res;
    }
};

8、最小覆盖子串

(1) 题目解析

(2) 算法原理        

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++;
        
        int hash2[128] = {0};
        int begin=-1,minlen=INT_MAX;

        // count用来记录[left,right]有效字符
        for(int left=0,right=0,count=0;right<s.size();++right)
        {
            // 1.入窗口 && count维护
            char in = s[right];
            // 滤过多余字符
            if(hash1[in] == ++hash2[in]) count++;
            // 2.结果更新
            while(count == kinds)
            {
                if(minlen > right - left + 1 ){
                    begin = left;
                    minlen = right - left + 1;
                }

                char out = s[left++];
                // 滤过多余字符
                if(hash1[out] == hash2[out]--) count--;
            }
        }

        if(begin == -1) return "";
        else return s.substr(begin,minlen);
    }
};

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

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

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

相关文章

mysql进阶-用户的创建_修改_删除

1. 使用mysql单次查询 [rootVM-4-6-centos /]# mysql -h localhost -P 3306 -p mytest -e "select * from book1"; Enter password: ------------------------------------------- | id | category_id | book_name | num | ----------------------------…

数据结构 | 基本数据结构——队列

目录 一、何谓队列 二、队列抽象数据类型 三、用Python实现队列 四、模拟&#xff1a;传土豆 五、模拟&#xff1a;打印任务 5.1 主要模拟步骤 5.2 Python实现 一、何谓队列 队列是有序集合&#xff0c;添加操作发生在“尾部”&#xff0c;移除操作则发生在“头部”。新…

【Javascript】基础知识

文章目录 01 变量的声明02 数据类型字符串型boolean类型undefined null类型symbol类型超大整数 bigint数组类型普通对象 01 变量的声明 02 数据类型 复习: 声明 ​ 声明变量关键词 ​ let ​ const ​ 变量名 >变量命名规范 ​ 英文 数字 _ $不要以数字开头 ​ 见名知意 ​…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包&#xff0c;提供机器学习实验所需的可视化和工具&#xff0c;该工具的功能如下&#xff1a; 跟踪和可视化指标&#xff0c;例如损失和精度可视化模型图&#xff08;操作和层&#xff09;查看权重、偏差或其…

【Java多线程学习4】volatile关键字及其作用

说说对于volatile关键字的理解&#xff0c;及的作用 概述 1、我们知道要想线程安全&#xff0c;就需要保证三大特性&#xff1a;原子性&#xff0c;有序性&#xff0c;可见性。 2、被volatile关键字修饰的变量&#xff0c;可以保证其可见性和有序性&#xff0c;但是volatile…

uniApp 对接安卓平板刷卡器, 读取串口数据

背景: 设备: 鸿合 电子班牌 刷卡对接 WS-B22CS, 安卓11; 需求: 将刷卡器的数据传递到自己的App中, 作为上下岗信息使用, 以完成业务; 对接方式: 1. 厂家技术首先推荐使用 接收自定义广播的方式来获取, 参考代码如下 对应到uniApp 中的实现如下 <template><view c…

python数据可视化Matplotlib

1.绘制简单的折线图 # -*- coding: utf-8 -*- import matplotlib.pyplot as pltinput_values [1, 2, 3, 4, 5] squares [1, 4, 9, 16, 25] plt.style.use(seaborn) fig, ax plt.subplots() ax.plot(input_values, squares, linewidth3) # 线条粗细# 设置图表标题并给坐标…

2023年第四届“华数杯”数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米&#xff0c;宽为12米&#xff0…

less的使用

less的介绍&#xff1a; less使用 1、 less使用的第一种用法&#xff0c;起变量名&#xff0c;变量名区分大小写&#xff1a; 这里我们定义一个粉色变量 我想使用直接把变量拿过来就行 2、vscode使用插件&#xff0c;直接将Css文件转换less文件&#xff1a; 3、第二种用法&…

8.泛型

目录 1 基本使用 2 多个泛型 3 泛型约束 3.1 数组 3.2 extends约束 3.3 用泛型约束泛型 4 泛型接口 5 ts中的数组用的就是泛型 6 泛型类 7 常用泛型工具类型 7.1 让所有属性变为可选属性 Partial 7.2 将所有属性都变为只读属性 Readonly 7.3 从指定类…

git-版本控制器

集中式版本控制工具&#xff08;不常用&#xff09; 版本库集中于中央服务器&#xff0c;team要联网才能工作&#xff08;下载代码&#xff09; SVN CVS 分布式版本控制工具 每个电脑上都有一个完整的版本库&#xff0c;工作时无需联网&#xff0c;可以把修改推送给其他人来…

ThreadLocal有内存泄漏问题吗

对于ThreadLocal的原理不了解或者连Java中的引用类型都不了解的可以看一下我的之前的一篇文章Java中的引用和ThreadLocal_鱼跃鹰飞的博客-CSDN博客 我这里也简单总结一下: 1. 每个Thread里都存储着一个成员变量&#xff0c;ThreadLocalMap 2. ThreadLocal本身不存储数据&…

python爬虫(四)_urllib2库的基本使用

本篇我们将开始学习如何进行网页抓取&#xff0c;更多内容请参考:python学习指南 urllib2库的基本使用 所谓网页抓取&#xff0c;就是把URL地址中指定的网络资源从网络流中读取出来&#xff0c;保存到本地。在Python中有很多库可以用来抓取网页&#xff0c;我们先学习urllib2。…

docker minio安装

1.介绍 Minio是一款开源的对象存储服务&#xff0c;它可以在任何硬件或云平台上提供高性能、高可用性和高安全性的存储解决方案。Minio最新版是2021年11月发布的RELEASE.2021-11-24T23-19-33Z&#xff0c;它带来了以下几个方面的改进和新特性&#xff1a; - 支持S3 Select AP…

Allegro选择暗显模式仍然无法实现暗显模式的解决办法

Allegro选择暗显模式仍然无法实现暗显模式的解决办法 用Allegro进行PCB设计的时候,时常需要使用到暗显模式,让视图中未被高亮的图形暗显下去,如下图 左边是未高亮的网络,右边是已高亮的 但是有时候因为一些原因,导致无法暗显,如下图 下面介绍如何解决这个问题,具体操作…

CSPM认证的价值?

最近 CSPM 证书很热门&#xff0c;含金量高&#xff0c;CSPM证书虽然发起的时间不长&#xff0c;但获取 CSPM 证书也是目前发展的一个趋势。如果打算在项目管理领域发展的强烈建议尽快获取 CSPM&#xff0c;提前为自己积攒一些资本。 一、什么是 CSPM证书&#xff1f;跟PMP是什…

Java-API简析_java.io.FileWriter类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132038909 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

elasticsearch 将时间类型为时间戳保存格式的时间字段格式化返回

dsl查询用法如下&#xff1a; GET /your_index/_search {"_source": {"includes": ["timestamp", // Include the timestamp field in the search results// Other fields you want to include],"excludes": []},"query": …

DevOps系列文章之 Docker 安装 NFS 服务器

Docker 安装 NFS 服务器 环境&#xff1a; 192.186.2.105 NFS 服务器 192.168.2.106 Client 客户端 安装 一、服务器端 https://github.com/f-u-z-z-l-e/docker-nfs-server 1、创建目录 mkdir /nfsdata mkdir -p /docker/nfs/2、启动脚本 vim start.sh# 内容 docker run …

ConCurrentHashMap常见面试题

1. JDK1.7和JDK1.8中ConCurrentHashMap的实现有什么不同&#xff1f; JDK1.7中的实现可以认为是大数组套小数组&#xff0c;大数组是Segment数组&#xff0c;小数组是HashEntry数组&#xff0c;锁是锁在大数组的元素上&#xff08;Segment&#xff09;&#xff0c;力度比较大&…