当前位置: 首页 > wzjs >正文

网站导入页欣赏网站推广在线

网站导入页欣赏,网站推广在线,青岛网站建设商家,南通网站建设方案托管提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言定义:滑动窗口一、定长滑动窗口1.定长子串中元音的最大数目2.子数组最大平均数13.大小为K且平均值大于等于阈值的子数组数目二、不定长滑动窗口1.无重…

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 定义:滑动窗口
  • 一、定长滑动窗口
    • 1.定长子串中元音的最大数目
    • 2.子数组最大平均数1
    • 3.大小为K且平均值大于等于阈值的子数组数目
  • 二、不定长滑动窗口
    • 1.无重复的最长字符串
    • 2.最长和谐子序列
    • 3.乘积小于k的子数组
  • 总结


前言

本篇主要是讲的是滑动窗口的两种类型。


定义:滑动窗口

什么是滑动窗口呢?就像它的名字一样,是一个滑动的窗口。
在这里插入图片描述

一、定长滑动窗口

对于定长滑动窗口,总体来说是简单一些的,就是由于长度定了,才使得接下来解题更方便。

1.定长子串中元音的最大数目

题目传送门:定长子串中元音的最大数目
在这里插入图片描述
解决代码:

class Solution {
public:int maxVowels(string s, int k) {int n = s.size();           // 字符串长度int ans = 0;                // 当前窗口内元音字母的数量unordered_map<char, int> m; // 用于快速判断字符是否为元音的哈希表m['a'] = 1;m['e'] = 1;m['i'] = 1;m['o'] = 1;m['u'] = 1;deque<char> p;              // 存储当前窗口中的字符(实际上可以优化掉)int max1 = 0;               // 记录最大元音数量// 初始化第一个窗口(前k个字符)for(int i = 0; i < k; i++) {p.push_back(s[i]);      // 将字符加入窗口if(m.count(s[i]))       // 如果是元音字母ans++;              // 计数器加1max1 = max(ans, max1);  // 更新最大值}// 滑动窗口:从第k个字符开始,逐个移动窗口for(int i = k; i < n; i++) {if(m.count(p.front()))  // 如果窗口最左侧字符是元音ans--;              // 移除该字符后计数器减1p.pop_front();          // 移除窗口最左侧字符p.push_back(s[i]);      // 添加新字符到窗口右侧if(m.count(s[i]))       // 如果新字符是元音ans++;              // 计数器加1max1 = max(ans, max1);  // 更新最大值}return max1;                // 返回最大元音数量}
};

对于这一题关键就是维持窗口的大小,同时还要注意窗口中的值的变化,对于结果的影响。

2.子数组最大平均数1

题目传送门:子数组最大平均数1
在这里插入图片描述
解决代码:

class Solution {
public:double findMaxAverage(vector<int>& nums, int k) {int n = nums.size();           // 数组长度deque<double> p;               // 存储当前窗口中的元素(可优化)double sum = 0;                // 当前窗口的元素和double ans = -1e5;             // 最大平均值(初始化为一个很小的值)// 预处理:先将前k-1个元素加入窗口for(int i = 0; i < k-1; i++) {p.push_back(nums[i]);      // 将元素加入队列sum += nums[i];            // 累加元素和}// 滑动窗口:从第k-1个元素开始,逐个移动窗口for(int i = k-1; i < n; i++) {p.push_back(nums[i]);      // 添加新元素到窗口右侧sum += nums[i];            // 更新窗口和// 计算当前窗口的平均值并更新最大值ans = max(ans, sum / k);// 移除窗口最左侧元素,为下一次滑动做准备sum -= p.front();          // 减去左侧元素的值p.pop_front();             // 移除左侧元素}return ans;                    // 返回最大平均值}
};

其实这一题与上面的题差不多。

3.大小为K且平均值大于等于阈值的子数组数目

题目传送门:大小为K且平均值大于等于阈值的子数组数目
在这里插入图片描述
解决代码:

class Solution {
public:int numOfSubarrays(vector<int>& arr, int k, int threshold) {int n = arr.size();           // 数组长度double sum = 0;               // 当前窗口的元素和int ans = 0;                  // 符合条件的子数组数量deque<double> p;              // 存储窗口元素(可优化掉)// 预处理:计算前k-1个元素的和for(int i = 0; i < k-1; i++) {sum += arr[i];p.push_back(arr[i]);      // 将元素加入队列(后续会被移除)}// 滑动窗口处理:从第k-1个元素开始遍历到数组末尾for(int i = k-1; i < n; i++) {sum += arr[i];            // 窗口右侧新增元素p.push_back(arr[i]);      // 将元素加入队列(可优化)// 判断当前窗口平均值是否达标if(sum / k >= threshold) {ans++;                // 达标则计数器加1}// 窗口左边界右移一位sum -= p.front();         // 减去窗口左侧元素p.pop_front();            // 移除队列头部元素(可优化)}return ans;                   // 返回符合条件的子数组数量}
};

二、不定长滑动窗口

对这一类题目,写这一些题目时,我更倾向于嵌套大佬的模板
在这里插入图片描述
对于这一类,通常是把问题分解成两个状态,以此来进行窗口的变化,

1.无重复的最长字符串

题目传送门:无重复的最长字符串
在这里插入图片描述
解决代码:

class Solution {
public:int lengthOfLongestSubstring(string s) {int n=s.size();int ans=0;unordered_map<char,int>m;//来记录是否出现重复字符for(int left=0,right=0;right<n;right++){m[s[right]]++;//每次都存一下字符出现的次数while(m[s[right]]>1)//如果最右边的字符出现多次进行循环{m[s[left]]--;//最左边的下标向右移动left++;}ans=max(ans,right-left+1);//每次都判断一下ans的最大值}return ans;}
};

2.最长和谐子序列

题目传送门:最长和谐子序列
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d1cdf06774914c4f887a0d429906503f.png
由于题目所说并不是连续子序列,所以可以先进行排序之后再进行操作
解决代码:

class Solution {
public:int findLHS(vector<int>& nums) {int n=nums.size();int ans=0;sort(nums.begin(),nums.end());//先进行排序,之后寻找满足条件的子数组就简单的一些for(int left=0,right=0;right<n;right++){while((nums[right]-nums[left])>1)//其最大值与最下值的差值如果大于1就将左下标进行向右移动{left++;}if(nums[right]-nums[left]==1)//如果满足条件就进行答案的更新。ans=max(right-left+1,ans);}return ans;}
};

3.乘积小于k的子数组

题目传送门:乘积小于k的子数组
在这里插入图片描述
对于这一题同样套用上面的模板,其中的条件也要进行改变一下,其中要主义left要小于等于right
解决代码:

class Solution {
public:int numSubarrayProductLessThanK(vector<int>& nums, int k) {int n=nums.size();int ans=0;int sum=1;for(int left=0,right=0;right<n;right++){sum*=nums[right];while(sum>=k&&left<=right)//满足这些条件时,将左下标向右移动,同时也要将数据移除。{sum=sum/nums[left];left++;} ans+=right-left+1;//至于为什么该操作可以计算出结果,请看下面的解释}return ans;}
};

在这里插入图片描述


总结

当然,经过这些题目的练习,还是只能做一些浅显的题目,对于那些条件特别复杂的,还是很难理清,希望,经过接下来的练习可以更精进一些。

http://www.dtcms.com/wzjs/421600.html

相关文章:

  • 设计公司网站需要什么条件河南百度关键词优化排名软件
  • 广元建设工程网站百度推广联盟
  • 个人网站怎么做最简短的培训心得
  • 本地怎样上传自己做的网站培训课程总结
  • 企业网站建设及维护seo培训班 有用吗
  • hi宝贝网站建设那家好最近一周新闻大事摘抄
  • 商丘公司做网站佛山seo
  • 中山网站建设多少钱平台宣传推广方案
  • 广东建设网 四川是什么网站网站子域名查询
  • html免费网站模板网站收录批量查询
  • 找人做网站需要什么条件汉中网络推广
  • 网站建设公司苏州网络推广产品要给多少钱
  • 网站建设交接协议书网站推广有哪些方式
  • 企业网站免费制作网络营销与直播电商专业
  • 天津市城乡建设部网站首页腾讯域名
  • 建设部职称证书查询官方网站海外推广渠道都有哪些
  • wordpress外链图片插件小程序seo
  • 建盏大师排名与落款网站关键词优化公司哪家好
  • 衣服商业网站建设策划书泉州seo排名扣费
  • 如何选择丹徒网站建设今日时政新闻热点
  • 通化建设工程信息网站网站开发的公司
  • 郑州网站建设中国建设建设银行深圳网络营销推广服务
  • 惠州网站建设 惠州邦百度投放广告流程
  • 如何做网站站内搜索代码网上营销新观察网
  • 深圳俄语网站建设网络营销实施方案
  • 怎做连接网站合肥网站推广
  • 网站建设平台协议书站长工具手机综合查询
  • 深圳网站建设门户上海百度搜索优化
  • 贵州公明建设投资咨询有限公司官方网站厦门百度竞价开户
  • 网站大图怎么做更吸引客户单页站好做seo吗