刷刷刷——滑动窗口

news/2024/5/19 17:04:50/文章来源:https://blog.csdn.net/Dirty_artist/article/details/133093537

在这里插入图片描述

文章目录

  • 209. 长度最小的子数组(中等)
    • 题目链接
    • 算法原理
    • 代码实现
  • 3. 无重复字符的最长子串(中等)
    • 题目链接
    • 算法原理
    • 代码实现
  • 1004. 最大连续1的个数 III(中等)
    • 题目链接
    • 算法原理
    • 代码实现
  • 1658. 将 x 减到 0 的最小操作数(中等)
    • 题目链接
    • 算法原理
    • 代码实现
  • 904. 水果成篮(中等)
    • 题目链接
    • 算法原理
    • 代码实现
  • 438. 找到字符串中所有字母异位词(中等)
    • 题目链接
    • 算法原理
    • 代码实现
  • 30. 串联所有单词的子串(困难)
    • 题目链接
    • 算法原理
    • 代码实现
  • 76. 最小覆盖子串(困难)
    • 题目链接
    • 算法原理
    • 代码实现

209. 长度最小的子数组(中等)

题目链接

209. 长度最小的子数组

算法原理

暴力枚举:

这里可以枚举出所有子数组的和,然后从中选出符合条件的,最后再选出长度最小的那组,这样的时间复杂度为O(N2)

滑动窗口:

image-20230920134313333

代码实现

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums){int sz = nums.size();int ret = INT_MAX;int sum = 0;for(int left=0,right=0;right<sz;right++){sum+=nums[right];while(sum>=target){ret = min(ret,right-left+1);sum-=nums[left++];}}return ret==INT_MAX?0:ret;}
};

3. 无重复字符的最长子串(中等)

题目链接

3. 无重复字符的最长子串

算法原理

暴力枚举+哈希表:

每个位置都进行从前往后枚举,然后用哈希表统计是否出现了重复元素

滑动窗口:

在暴力枚举的思想上做出优化

image-20230920175315091

代码实现

class Solution {
public:int lengthOfLongestSubstring(string s){int left = 0;int right = 0;int hash[128] = { 0 };int ret = INT_MIN;while(right<s.size()){//进窗口hash[s[right]]++;//值有重复,出窗口while(hash[s[right]]>1){hash[s[left++]]--;}ret = max(ret,right-left+1);right++;}return ret==INT_MIN?0:ret;}
};

1004. 最大连续1的个数 III(中等)

题目链接

1004. 最大连续1的个数 III

算法原理

暴力枚举+0计数器

连续的1,再加上k0

image-20230920175911796

滑动窗口:

image-20230920180749289

代码实现

class Solution {
public:int longestOnes(vector<int>& nums, int k){int left = 0;int right = 0;int zeroCount = 0;int ret = INT_MIN;while(right<nums.size()){if(nums[right] == 0)zeroCount++;while(zeroCount>k){if(nums[left] == 0)zeroCount--;left++;}ret = max(ret,right-left+1);right++;}return ret;}
};

1658. 将 x 减到 0 的最小操作数(中等)

题目链接

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

算法原理

思路转换:

找出最长的子数组长度,让这个子数组中元素的和正好等于sum-x(sum为整个数组的和),然后采用滑动窗口思想

代码实现

class Solution {
public:int minOperations(vector<int>& nums, int x){int left = 0;int right = 0;int len = INT_MIN;int arrSum=0;for(auto e:nums){arrSum+=e;}int sum = 0;int target = arrSum-x;//target<0的话,滑动窗口就不适用if(target < 0)return -1;while(right<nums.size()){sum+=nums[right];while(sum>target){sum-=nums[left];left++;}if(sum == target)len = max(len,right-left+1);right++;}return len==INT_MIN?-1:nums.size()-len;}
};

904. 水果成篮(中等)

题目链接

904. 水果成篮

算法原理

这里原始思路也是暴力枚举+哈希表,再原思路上作出优化,采用滑动窗口思想

image-20230920182120866

代码实现

使用库里面的哈希表:

class Solution {
public:int totalFruit(vector<int>& fruits){unordered_map<int,int> mp;int ret = INT_MIN;int left = 0;int right = 0;while(right<fruits.size()){mp[fruits[right]]++;while(mp.size() > 2){mp[fruits[left]]--;if(mp[fruits[left]] == 0)mp.erase(fruits[left]);left++;}ret = max(ret,right-left+1);right++;}return ret==INT_MIN?0:ret;}
};

这里提交会发现,时间还是较长的,虽然量级是在O(N),但因为这里涉及到哈希表的多次插入和删除,所以还是费些时间;

然后这里发现,题目给的数据范围有限:1 <= fruits.length <= 105,所以我们可以模拟哈希表的操作,自己造一个建议的哈希表

简易哈希表:

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

对比:

image-20230919213933077

438. 找到字符串中所有字母异位词(中等)

题目链接

438. 找到字符串中所有字母异位词

算法原理

滑动窗口+哈希表:

将字符丢入哈希表,然后当窗口大小等于p的大小的时候,开始判断这个哈希表是否相同

代码实现

class Solution
{
public:bool checkHash(int h1[], int h2[]){for (int i = 0, j = 0; i < 26; i++,j++){if (h1[i] != h2[j])return false;}return true;}vector<int> findAnagrams(string s, string p){int left = 0;int right = 0;vector<int> ret;int hash1[26] = { 0 };int hash2[26] = { 0 };for (auto e : p){hash1[e - 97]++;}while (right < s.size()){hash2[s[right] - 97]++;if (right - left + 1 == p.size()){if (checkHash(hash1, hash2))ret.push_back(left);hash2[s[left++] - 97]--;right++;continue;}right++;}return ret;}
};

这里每次都要比较哈希表,复杂度其实是O(26*N),我们可以将比较方法改变一下

优化:

不对比哈希表,用count记录窗口有效字符的个数

class Solution
{
public:vector<int> findAnagrams(string s, string p){int left = 0;int right = 0;vector<int> ret;int hash1[26] = { 0 };int hash2[26] = { 0 };for (auto e : p){hash1[e - 97]++;}int count = 0;while (right < s.size()){hash2[s[right] - 97]++;if(hash2[s[right]-97] <= hash1[s[right]-97])count++;if(right-left+1>p.size()){if(hash2[s[left]-97]<=hash1[s[left]-97]){count--;}hash2[s[left++]-97]--;}if(count == p.size())ret.push_back(left);right++;}return ret;}
};

对比

image-20230920101611901

30. 串联所有单词的子串(困难)

题目链接

30. 串联所有单词的子串

算法原理

采用438. 找到字符串中所有字母异位词的思路,将这些字符串看作字符

image-20230920183019594

代码实现

class Solution {
public:
vector<int> findSubstring(string s, vector<string>& words)
{vector<int> ret;unordered_map<string, int> hash1;for (auto e : words){hash1[e]++;}int sz = s.size();int len = words[0].size();int m = words.size();for(int i =0;i<len;i++){   int count = 0;unordered_map<string, int> hash2;for (int left = i, right = i; right < sz;){string tmp = s.substr(right, len);hash2[tmp]++;//如果表1里面没有这个元素,就直接不比较了,避免又再临时去哈希表里面创建一个if (hash1.count(tmp) && hash2[tmp] <= hash1[tmp])count++;if (right - left + 1 > m*len){string out = s.substr(left, len);if (hash1.count(out) && hash2[out] <= hash1[out])count--;hash2[out]--;left += len;}if (count == m)ret.push_back(left);right += len;}}return ret;
}
};

76. 最小覆盖子串(困难)

题目链接

76. 最小覆盖子串

算法原理

哈希表+滑动窗口:

2个哈希表:一个放t的元素,然后统计有多少种元素;另一个用滑动窗口来放入元素,当这个哈希表中包含目标字符串,并且对应个数不小于目标串哈希表中各字符的个数时,那就可以更新这个窗口的大小

代码实现

class Solution
{
public:string minWindow(string s, string t){int hash1[128] = { 0 };int kinds = 0;  //字符种类for(auto e:t){if(hash1[e] == 0)kinds++;hash1[e]++;}int count = 0;int len = INT_MAX;int begin = -1;int hash2[128] = { 0 };for(int left=0,right=0;right<s.size();right++){int in = s[right];if(++hash2[in] == hash1[in])count++;while(count == kinds){if(right-left+1<len){len = right-left+1;begin = left;}int out = s[left++];if(hash2[out]-- == hash1[out])count--;}}return len==INT_MAX?"":s.substr(begin,len);}
};

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[矩阵的乘法运算] m*M = c

另人给的一道题&#xff0c;一时没弄出来&#xff0c;后来看WP&#xff0c;复现一下。 对于矩阵运算 m*M c 求m 的情况。 满秩差1半秩 import os import secret import hashlib from Crypto.Util.number import getPrime from Crypto.Util.Padding import padLEN 32def xo…

Denoising diffusion implicit models 阅读笔记

Denoising diffusion probabilistic models (DDPMs)从马尔科夫链中采样生成样本&#xff0c;需要迭代多次&#xff0c;速度较慢。Denoising diffusion implicit models (DDIMs)的提出是为了加速采样过程&#xff0c;减少迭代的次数&#xff0c;并且要求DDIM可以复用DDPM训练的网…

【AI视野·今日CV 计算机视觉论文速览 第252期】Fri, 22 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 22 Sep 2023 Totally 90 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;SVGCustomization, 基于文本的矢量图生成定制(from 香港城市大学)。 website:https://intchous.github.io/SVGCustomization/ …

基于SpringBoot的社区医院信息平台

目录 前言 一、技术栈 二、系统功能介绍 患者信息管理 护士信息管理 医生信息管理 药品管理员管理 患者添加 安排检查 完成注射列表 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系…

【一、虚拟机vmware安装】

安装虚拟机 下载 官方下载地址&#xff1a;https://www.vmware.com/cn.html 大概流程就是&#xff0c;最重要的事最后一步

问题:conda删除虚拟环境,报错no package names supplied

用conda 用 conda remove -n ScratchDet_20200114 删除虚拟 环境ScratchDet_20200114时报错 conda remove -n ScratchDet_20200114CondaValueError: no package names supplied,try "conda remove -h" for more details 解决方法&#xff0c;用下面的命令 conda env…

什么是CORS(跨源资源共享)?如何解决前端中的CORS问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CORS&#xff08;跨源资源共享&#xff09;⭐ 解决前端中的CORS问题的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为…

LeetCode【174. 地下城游戏】

一片丹心图报国&#xff0c;两行清泪为忠家。——于谦 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康…

Python进阶学习----一闭三器

目录 ​编辑 前言 一.三器 1. 迭代器&#xff08;Iterator&#xff09; 1.1 什么是可迭代对象 1.2什么是迭代器 1.3案例演示&#xff1a; 以下是一个简单的迭代器示例&#xff0c;遍历一个列表并打印每个元素&#xff1a; 1.4迭代器总结 2. 生成器&#xff08;Generat…

前端uniapp如何转base64使用uniapp插件市场

插件市场 网址 使用 可以下载&#xff0c;也可以引用&#xff0c;我是下载下来的引用 代码 正常使用 pathToBase64(img).then(path > {img pathresolve(path)}).catch(error > {console.error(error)reject(error)})使用出现[object Promise]错误 解决方法 let img …

算法通关村第16关【青铜】| 滑动窗口思想

1. 滑动窗口的基本思想 一句话概括就是两个快慢指针维护的一个会移动的区间 固定大小窗口&#xff1a;求哪个窗口元素最大、最小、平均值、和最大、和最小 可变大小窗口&#xff1a;求一个序列里最大、最小窗口是什么 2. 两个入门题 &#xff08;1&#xff09;子数组最大平…

Docker部署Nginx+FastDFS插件

文章目录 一、部署FastDFS二、部署Nginx(带FastDFS插件)三、FastDFS上传文件Nginx访问验证 一、部署FastDFS 1、准备工作 docker pull qinziteng/fastdfs:5.05 Pwd"/data/software/fastdfs" mkdir ${Pwd}/{storage,tracker} -p2、创建TEST容器&#xff0c;将fastdf…

RK3568平台开发系列讲解(工具命令篇)ADB的安装

🚀返回专栏总目录 文章目录 一、ADB介绍二、Windows 下安装 adb 工具沉淀、分享、成长,让自己和他人都能有所收获!😄 一、ADB介绍 adb 全称 Android Debug Bridge,直译过来就是 Android 调试桥,它是一个通用的命令行工具。adb 做为 Android 设备与 PC 端连接的一个桥梁…

linux c++调用c

参考 【Linux下gcc编译的四个过程】_Deacde_ZY的博客-CSDN博客 C与C如何互相调用_c文件引用c头文件_卍一十二画卍的博客-CSDN博客 Linux动态链接库的创建与使用_linux创建动态库_满天星羽的博客-CSDN博客 c调用c 1.1 例子1&#xff1a; test1.c #include <stdio.h>…

Python|OpenCV-访问并修改图片像素值,鉴别彩色和灰色图像(6)

前言 本文是该专栏的第6篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用OpenCV对图像进行操作的时候,通常需要熟练掌握一些Numpy知识点。因为有的时候需要用到Numpy和OpenCV结合去实现图像的操作,所以说想要写出较好的OpenCV代码的最好方法,就需要有Nump…

【线性代数】为什么 AA* = |A|E

A A ∗ 矩阵相乘&#xff0c;刚好是行列式展开的定义 AA*矩阵相乘&#xff0c;刚好是行列式展开的定义 AA∗矩阵相乘&#xff0c;刚好是行列式展开的定义 矩阵提取一个因子 ∣ A ∣ &#xff0c;所有元素需要除 ∣ A ∣ 矩阵提取一个因子 |A|&#xff0c;所有元素需要除 |A| 矩…

idea集成tomcat(Smart Tomcate插件安装)

当我们在 tomcat 上部署好一个 webapp 后&#xff0c;如果我们要修改代码&#xff0c;就需要重新进行打包和部署&#xff0c;但往往在工作中是需要频繁修改代码&#xff0c;然后再查看成果的&#xff0c;就需要反复的进行打包和部署的过程&#xff0c;这是很麻烦的 通过 Smart …

腾讯云16核服务器配置大全_CVM和轻量服务器汇总

腾讯云16核CPU服务器有哪些配置可以选择&#xff1f;可以选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xf…

基于微信小程序的图书借阅管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

浏览器基本原理

1、浏览器内部组成 我们看到浏览器主要包括&#xff1a; 1个浏览器主进程&#xff1a; 主要负责界面显示&#xff0c;用户交互&#xff0c;子进程管理多个渲染进程&#xff1a;一般浏览器会为每个Tab标签窗口创建一个渲染进程&#xff0c;主要负责将html&#xff0c;css&#…