算法需知
滑动窗口算法是在给定特定窗口大小的数组或字符串上执行要求的操作。该技术可以将一部分问题中的嵌套循环转变为一个单循环,因此它可以减少时间复杂度。
简而言之,滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。
其实这里就可以看出来滑动窗口主要应用在数组和字符串上。
最大连续1的个数Ⅰ
题目来源:最大连续1的个数Ⅰ
解提思路:滑动窗口算法。
代码示例
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int left=0,right=0;
int res=0;
int len=nums.size();
while(right<len){
if(nums[right]==1){
right++;
}
else{
right++;
left=right;
}
res=max(res,right-left);
}
return res;
}
};
int main(){
int n; cin>>n;
vector<int>nums(n,0);
for(int i=0;i<n;i++){
cin>>nums[i];
}
Solution s;
cout<<s.findMaxConsecutiveOnes(nums);
}
最大连续1的个数Ⅱ
题目来源:最大连续1的个数Ⅱ
解题思路:采用滑动窗口算法,控制窗口内0的个数至多为1
代码示例
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums) {
int res=0,count=0;
for(int l=0,r=0;r<nums.size();r++){//双指针维护一个窗口,最多只有1个0
if(nums[r]==0){
count++;
while(count>1){//while循环控制窗口内0的个数
if(nums[l]==0) count--;
l++;
}
}
res=max(res,r-l+1);
}
return res;
}
};
int main(){
int n; cin>>n;
vector<int>nums(n,0);
for(int i=0;i<n;i++){
cin>>nums[i];
}
Solution s;
cout<<s.findMaxConsecutiveOnes(nums);
}
最大连续1的个数Ⅲ
题目来源:最大连续1的个数Ⅲ
解题思路:采用滑动窗口算法,使窗口内0的个数至多为k
代码示例
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMaxConsecutiveOnes(vector<int>& nums,int k) {
int res=0,count=0;
for(int l=0,r=0;r<nums.size();r++){
if(nums[r]==0){
count++;
while(count>k){
if(nums[l]==0) count--;
l++;
}
}
res=max(res,r-l+1);
}
return res;
}
};
int main(){
int n,k; cin>>n;
vector<int>nums(n,0);
for(int i=0;i<n;i++){
cin>>nums[i];
}
cin>>k;
Solution s;
cout<<s.findMaxConsecutiveOnes(nums,k);
}