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

【算法专题】滑动窗口类

                                个人主页: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.mrgr.cn/news/5032.html

相关文章:

  • akamai40并发
  • Git使用速通
  • 使用cbsd指令快速创建bhyve Ubuntu虚拟机实践
  • 【JavaScript】LeetCode1-5
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • 音频分割软件有什么?最方便的音频分割软件分享给你
  • Spark-第五周
  • 对话框 Ref或者dom都拿不到详解
  • PHP导出生成PDF文件开源组件:mPDF使用详情
  • Arduino开源四足蜘蛛机器人制作教程
  • DISCUZ论坛中 “阅读权限10“这几个字的修改教程以及后台目录路径修改后的管理路径
  • Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
  • CSP内容安全策略
  • 深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)
  • RFID光触发标签在多行业的应用与效益差异
  • 并行程序设计基础——组通信(1)
  • 【HTTP学习】HTTP协议
  • 全球财经动态与行业动态概览
  • PHP 过滤器
  • 【分布式缓存】使用Redis、Memcached等工具进行分布式缓存管理