【算法专题】滑动窗口类

devtools/2024/10/15 18:09:57/

                                个人主页:CSDN_小八哥向前冲~

                                 所属专栏:算法基础入门


目录

长度最小的子数组

无重复字符的最长子串

最大连续1的个数

将x减到0的最小操作数

水果成篮

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

最小覆盖字串


长度最小的子数组

题目:【LeetCode】长度最小的子数组

思路:

解法一:暴力枚举,注意,一般不推荐,因为有些题目因为时间效率问题,过不了  oj   !!!

代码:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size(),len=INT_MAX;for(int i=0;i<n;i++){int sum=0;for(int j=i;j<n;j++){sum+=nums[j];if(sum>=target) len=min(len,j-i+1);}}return len==INT_MAX?0:len;}
};

解法二:双指针(滑动窗口)

代码:

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int sum=0,n=nums.size(),len=INT_MAX;for(int left=0,right=0;right<n;right++){//进窗口sum+=nums[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]={0};int n=s.size(),len=0;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 n=nums.size(),len=0;for(int left=0,right=0,zero=0;right<n;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) {int sum1=0;for(auto& e:nums)sum1+=e;int n=nums.size(),target=sum1-x,ret=-1;//细节if(target<0)return -1;for(int left=0,right=0,sum2=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?ret:n-ret;}
};

水果成篮

题目:【LeetCode】水果成篮

思路:

代码:

class Solution {
public:int totalFruit(vector<int>& fruits) {int hash[100000]={0};int n=fruits.size(),ret=0;for(int left=0,right=0,count=0;right<n;right++){if(hash[fruits[right]]==0) count++;//记录有效数字hash[fruits[right]]++;//进哈希while(count>2) //出窗口挪动数据{hash[fruits[left]]--;if(hash[fruits[left]]==0) count--;left++;}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(auto& e:p)hash1[e-'a']++;int len=p.size();int hash2[26]={0};int n=s.size(),count=0;//count记录有效字母for(int left=0,right=0;right<n;right++){char in=s[right];if(++hash2[in-'a']<=hash1[in-'a']) count++;//进窗口记录countif(right-left+1>len)//出窗口{char out=s[left++];if(hash2[out-'a']--<=hash1[out-'a']) count--;}if(count==len) ret.push_back(left);//记录下标}return ret;}
};

最小覆盖字串

题目:【LeetCode】最小覆盖字串

思路:

代码:

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++;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];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--;}}if(begin==-1) return "";else return s.substr(begin,minlen);}
};

这些题目你都会了嘛?我们下期见!


http://www.ppmy.cn/devtools/97926.html

相关文章

【Postgresql】随手记:创建时间、更新时间数据库端自动实现更新

postgresql数据表中 字段 解释 id&#xff1a; 自增数字&#xff1b; name&#xff1a;字符串&#xff1b; create_at&#xff1a;记录创建数据的时间&#xff1b; update_at&#xff1a;记录更新记录的时间&#xff1b; 想法&#xff1a; create_at 和 update_at 字段用于记录…

【微服务】springboot 整合表达式计算引擎 Aviator 使用详解

目录 一、前言 二、表达式计算框架概述 2.1 规则引擎 2.1.1 什么是规则引擎 2.1.2 规则引擎用途 2.1.3 规则引擎使用场景 2.2 表达式计算框架 2.2.1 表达式计算框架定义 2.2.2 表达式计算框架特点 2.2.3 表达式计算框架应用场景 2.3 表达式计算框架与规则引擎异同点 …

优化WAN流量:如何通过调整系统设置降低企业网络成本

一、症状与问题背景 当电脑显示空闲状态时&#xff0c;如果满足以下条件&#xff0c;第二拨号链接可能会意外激活&#xff1a; 您正在使用基于 Microsoft Windows 的计算机&#xff0c;该计算机连接到远程网络并且是 Active Directory 域服务 (AD DS) 域的成员。 您通过二级…

防火墙技术原理与应用

防火墙概述 防火墙概念 防火墙:通过一种网络安全设备,控制安全区域间的通信,隔离有害通信,进而阻断网络攻击。一般安装在不同安全区域边界处,用于网络通信安全控制,由专用硬件或软件系统组成。 根据网络安全信任程度和需保护的对象,划分安全区域 公共外部网络:Inter…

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…

回溯算法(基于Python)

递归 递归(recursion)是一种算法策略&#xff0c;通过函数调用自身来解决问题。"递"指程序不断深入地调用自身&#xff0c;通常传入更小或更简化的参数&#xff0c;直到达到“终止条件”。"归"指触发终止条件后&#xff0c;程序从最深层的递归函数开始逐层…

波导阵列天线单元 学习笔记3 基于空气填充双模馈网的双圆极化膜片天线阵列

摘要&#xff1a; 此通信提出了一种使用空气填充双模馈网的基于膜片极化器的双圆极化天线阵列。一种1分4的圆腔单层覆盖在膜片极化器上来抑制栅瓣。全公司馈网被一个双模传输线所实现&#xff0c;以此在一组馈网内联合了TEM模式&#xff08;由HW悬架线激励&#xff09;和TE10模…

Transformer(课程笔记)

一&#xff1a;Motivation RNN需要顺序的执行&#xff0c;不利于并行计算。 RNN的变体例如GRU、LSTM等需要依靠注意力机制解决信息瓶颈等问题。 抛弃RNN结构&#xff0c;提出了Transformer结构。 Transformer整体架构 二&#xff1a; 输入层&#xff08;BPE&#xff0c;PE&…