算法专题二:滑动窗口

算法专题二:滑动窗口

  • 一.长度最小的子数组:
    • 1.思路一:暴力解法
    • 2.思路二:滑动窗口+双指针
    • 3.GIF题目解析:
      • 思路一:
      • 思路二:
  • 二.无重复字符的最长子串:
    • 1.思路一:滑动窗口
    • 2.GIF题目解析:
      • 思路一:
  • 三.最大连续1的个数:
    • 1.思路一:滑动窗口
    • 2.GIF题目解析:
  • 四:将x减小到0的最小操作数:
    • 1.思路一:滑动窗口
    • 2.GIF题目解析:
  • 五.水果成篮
    • 1.思路一:滑动窗口
    • 2.GIF题目解析:
  • 六. 找到字符串中的所有字母的异位词
    • 1.思路一:滑动窗口
    • 2.思路二:滑动窗口(比较优化)
    • 2.GIF题目解析:
  • 七.串联所有单词的子串
    • 1.思路一:滑动窗口 + 哈希映射:
    • 2.GIF题目解析:
  • 八.最小覆盖子串
    • 1.思路一:暴力解法+哈希表
    • 2.思路二:滑动窗口+哈希表
    • 2.GIF题目解析:

一.长度最小的子数组:

在这里插入图片描述
长度最小的子数组

1.思路一:暴力解法

在这里插入图片描述

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

2.思路二:滑动窗口+双指针

在这里插入图片描述

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

3.GIF题目解析:

思路一:

在这里插入图片描述

思路二:

在这里插入图片描述

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

在这里插入图片描述

无重复字符的最长子串

1.思路一:滑动窗口

在这里插入图片描述

class Solution {
public:int lengthOfLongestSubstring(string s) {int len = 0;int hash[128]={0};for(int left=0,right=0;right<s.size();right++){ hash[s[right]]++;while(hash[s[right]]>1){hash[s[left]]--;left++;  }len = max(len,(right-left+1));}return len;}
};

2.GIF题目解析:

思路一:

在这里插入图片描述

三.最大连续1的个数:

在这里插入图片描述

最大连续1的个数

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;}
};

2.GIF题目解析:

开头位0 并且k为0算是一个特殊的情况这样的情况有一些考虑就走不出去前面的0而忽略到后面数组自带1,走不到这些1数据导致记录连续1的个数出问题!

在这里插入图片描述

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

在这里插入图片描述

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

1.思路一:滑动窗口

在这里插入图片描述

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum_1 = 0;vector<int>::iterator it_1 = nums.begin();while (it_1 != nums.end()){sum_1 += (*it_1);it_1++;}int n = nums.size();int target = sum_1 - x;if(target <= 0){if(target<0)return -1;elsereturn n;}//1.滑动窗口:int sum_2 = 0;int ret = 0;for (int left = 0, right = 0; right < n; right++){sum_2 += nums[right];while (sum_2 >= target){if(sum_2 == target)ret = max(ret, (right - left) + 1);sum_2 -= nums[left];left++;}if(sum_2 == target)ret = max(ret, (right - left) + 1);}return (ret==0? -1:n-ret);}
};

2.GIF题目解析:

在这里插入图片描述

五.水果成篮

在这里插入图片描述

水果成篮

1.思路一:滑动窗口

在这里插入图片描述

class Solution {
public:int totalFruit(vector<int>& fruits) {int Hash[100001]={0};int n = fruits.size();int len = 0;for(int left=0,right=0,zero=0;right<n;right++){if(Hash[fruits[right]]==0){Hash[fruits[right]]++;zero++;}else{Hash[fruits[right]]++;}while(zero > 2){Hash[fruits[left]]--;if(Hash[fruits[left++]]==0)zero--;}len = max(len , (right-left)+1);}return len;}
};

2.GIF题目解析:

在这里插入图片描述

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

在这里插入图片描述

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

1.思路一:滑动窗口

在这里插入图片描述

class Solution {
public:vector<int> findAnagrams(string s, string p) {int hash1[26]={0};int len = p.size();for(auto ch:p){hash1[ch -'a']++;}int hash2[26]={0};vector<int> vv;for(int left=0,right=0;right<s.size();right++){hash2[s[right] - 'a']++;if((right-left+1) == len){//1.判断是否相等int flag = 0;for(int i=0;i<26;i++){if(hash1[i] != hash2[i]){flag = -1;break;}}if(flag!=-1)vv.push_back(left);hash2[s[left] - 'a']--;left++;}}return vv;}
};

2.思路二:滑动窗口(比较优化)

1.我们有注意到一个问题在比较相等确定left可不可以push的时候去优化一下26次循环比较的过程。
2.可以给一个变量去控制数量的变化。

class Solution {
public:vector<int> findAnagrams(string s, string p) {int hash1[26]={0};int len = p.size();for(auto ch:p){hash1[ch -'a']++;}int hash2[26]={0};vector<int> vv;for(int left=0,right=0,count=0;right<s.size();right++){//hash2[s[right] - 'a']++;if(++hash2[s[right] - 'a'] <= hash1[s[right] - 'a'])count++;if((right-left+1) > len){char out = s[left++];//出去窗口:if(hash2[out-'a']-- <= hash1[out-'a'])count--;}if(count == len) vv.push_back(left);}return vv;}
};

2.GIF题目解析:

请添加图片描述

七.串联所有单词的子串

在这里插入图片描述

串联所有单词的子串

1.思路一:滑动窗口 + 哈希映射:

在这里插入图片描述

在这里插入图片描述

class Solution {
public:vector<int> findSubstring(string s, vector<string>& words) {vector<int> ret;unordered_map<string,int> hash1;for(auto& s:words)hash1[s]++;int len = words[0].size();int 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){string in = s.substr(right,len);hash2[in]++;//1,进入窗口 + 维护countif(hash1.count(in) && hash2[in] <= hash1[in])count++;if((right-left+1) > (len*m)){//2.出去窗口 + 维护countstring out = s.substr(left,len);if(hash1.count(out) && hash2[out] <= hash1[out])count--;hash2[out]--;left+=len;}//3.数据更新:if(count == m) ret.push_back(left);}}return ret;}
};

2.GIF题目解析:

请添加图片描述

八.最小覆盖子串

在这里插入图片描述

最小覆盖子串

1.思路一:暴力解法+哈希表

在这里插入图片描述

class Solution {
public:string minWindow(string s, string t) {int hash1[128] = { 0 };for (char ch : t){hash1[ch]++;}int kind = t.size();int len = INT_MAX;int begin = 0;for (int i = 0; i < s.size(); i++){int hash2[128] = { 0 };int count = 0;for (int j = i; j < s.size(); j++){if (hash2[s[j]]++ < hash1[s[j]] && hash1[s[j]]!=0)count++;if (kind == count){//更新数据:if (j - i + 1 <= len){len = j - i + 1;begin = i;}}}}string vv("");if (kind > s.size() || len == INT_MAX)return vv;vv = s.substr(begin, len);return vv;}
};

在这里插入图片描述

2.思路二:滑动窗口+哈希表

在这里插入图片描述

class Solution {
public:string minWindow(string s, string t) {int hash1[128] = { 0 };int kind = 0;for (char ch : t){if(hash1[ch]++ == 0)kind++;}int len = INT_MAX;int begin = -1;int hash2[128] = { 0 };for (int left = 0, right = 0, count = 0; right < s.size(); right++){//1.进入窗口+维护countchar in = s[right];if(++hash2[in] == hash1[in])count++;//2.判断出窗口+维护countwhile(count == kind){if(right-left+1 < len){len = right-left+1;begin = left;}char out = s[left++];if(hash2[out]-- == hash1[out])count--;}}if(begin == -1)return "";elsereturn s.substr(begin,len);}
};

2.GIF题目解析:

在这里插入图片描述

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

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

相关文章

Unity 如何通过2D Sprite切割一张图为多张

1、理解 在一些2D游戏开发中&#xff0c;我们常常使用2D Sprite把一张大图切割成多个小图使用。 这样做有不少好处&#xff0c;首先&#xff0c;通过精准使用小图&#xff0c;能够一定程度上节省内存&#xff0c;提高渲染性能。 其次把同类的小图做成一张大图在切割使用会更…

【AI基础设施】智算场景的资源管理系统与未来展望

高性能计算与智算场景 首先澄清两个概念&#xff0c;高性能计算与智算场景&#xff0c;高性能计算主要是面向天气预测、生物计算、材料计算等场景&#xff0c;而最近几年很火的智算主要是面向AI场景的计算&#xff0c;如语音识别、图像识别、自动驾驶等场景&#xff0c;我们可…

行为树保姆级教程(以机器人的任务规划为例

行为树 目录 什么是行为树(behavior tree)&#xff1f;行为树的相关术语 行为节点和控制节点不同类型的控制结点&#xff1a; 顺序节点选择节点并行节点装饰结点 机器人的例子&#xff1a;物体搜索 1&#xff1a;如果只存在一个地点A&#xff0c;那么行为树很简单&#xff0…

qt实现基本文件操作

先通过ui界面实现基本框架 接下来就要实现每个按键的功能了 我们先来实现新建的的功能&#xff0c;我们右键新建键&#xff0c;可以发现没有转到槽的功能&#xff0c;因此我们要自己写connect来建立关系。 private slots:void newActionSlot(); 在.h文件中加上槽函数。 conne…

AI技术对于IT数据安全的革新与挑战

随着ChatGPT的出现&#xff0c;人工智能 (AI) 技术进入了一个新的时代&#xff0c;各行各业的营运方式亦随之而产生了深远影响。AI技术的发展正在重塑安全行业&#xff0c;给企业带来了新的思考和挑战。同时&#xff0c;国际和国家对企业数据使用的管控也越发严格&#xff0c;使…

hypervisor display显卡节点card0生成过程

ditsi 配置 lagvm/LINUX/android/vendor/qcom/proprietary/devicetree/qcom direwolf-g9ph.dts #include "direwolf-vm-la.dtsi" direwolf-vm-la.dtsi #include "display/quin-vm-display-la.dtsi" quin-vm-display-la.dtsi //对应/sys/class/drm/card…

Linear Regression线性回归(一元、多元)

目录 介绍&#xff1a; 一、一元线性回归 1.1数据处理 1.2建模 二、多元线性回归 2.1数据处理 2.2数据分为训练集和测试集 2.3建模 介绍&#xff1a; 线性回归是一种用于预测数值输出的统计分析方法。它通过建立自变量&#xff08;也称为特征变量&#xff09;和因变…

选择正确的自动化测试工具:打造高效测试流程的必备利器!

摘要 自动化测试正在逐步取代部分手动测试&#xff0c;因为它可以节省时间并提高测试质量。特别是在进行回归测试的情况下&#xff0c;自动化可以通过多种方式提高效率。手动进行重复测试是浪费时间和资源。此外&#xff0c;由于重复测试可能会遗漏&#xff0c;因此存在一定的…

PCL点云处理之点云置平(拟合平面绕中心旋转到绝对水平)(二百二十七)

PCL点云处理之点云置平(绕中心旋转到绝对水平)(二百二十七) 一、什么是点云置平二、算法流程三、算法实现一、什么是点云置平 有时候,我们处理的点云平面并非位于水平面,而是位于某个任一三维平面上,而大多数算法又只能在水平面处理,或者水平面的点云处理是相对更简单…

滑动窗口(一)

滑动窗口 什么是滑动窗口算法&#xff1f;通俗的来讲就是 “同向双指针” &#xff0c;当一组数据的规律含有单调性的时候&#xff0c;就可以使用下面这套逻辑来优化暴力解法。 当两个指针同向移动的时候&#xff0c;类似于一个窗口在滑动。使用于在连续序列里找特殊的子串、…

Java基础回顾——面向对象编程

文章目录 面向对象基础方法构造方法默认构造方法多构造方法 方法重载继承多态抽象类接口静态字段和静态方法包作用域内部类 写在最后 https://www.liaoxuefeng.com/wiki/1252599548343744/1255943520012800 面向对象编程Object-Oriented Programming&#xff0c;简称OOP&#…

Windows phpstudy vscode Xdebug调试无效,无法监听,没有什么效果

Windows phpstudy vscode Xdebug调试无效&#xff0c;无法监听&#xff0c;没有什么效果 vscode 正常&#xff0c;能启动&#xff0c;能标记&#xff0c;就是无法监听 打印phpinfo(); Xdebug版本3 打印的信息输入这里&#xff0c;找出对应PHPXdebug的dll文件 Xdebug: Sup…