滑动窗口专题
滑动窗口专题
209. Minimum Size Subarray Sum
给定一个都是正数的数组和值s,求满足和≥s的连续子数组的最小长度,没有则返回0
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n=nums.size();
int res = n+1;
int l=0;
// r先滑动
for(int r=0;r<n;++r) {
s-=nums[r];
while(s<=0) {
// s<=0 即 l~r 元素的和恰好满足和 >= s
// 取最小值,l再向前滑动
res = min(res, r-l+1);
s+=nums[l++];
}
}
return res % (n+1);
}
};1248. Count Number of Nice Subarrays
返回满足条件的连续子数组的个数,子数组需要含有 k 个奇数
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int n = nums.size();
int count = 0;
vector<int> m;
m.push_back(-1);
for(int i=0;i<n;++i) {
if (nums[i]&1) m.push_back(i);
}
m.push_back(n);
if (m.size()-2 < k) return 0;
int l=1;
int r=k;
while(r<m.size()-1) {
int a = m[l] - m[l-1] - 1;
int b = m[r+1] - m[r] - 1;
count += 1 + a + b + a*b;
++l;
++r;
}
return count;
}
};1234. Replace the Substring for Balanced String
一个串中只存在四种字符,每种字符出现次数为长度/4次那么这个串为平衡串,求将原串替换成平衡串的最短子串的长度
class Solution {
public:
int balancedString(string s) {
unordered_map<int, int> count;
count.insert({'Q', 0});
count.insert({'W', 0});
count.insert({'E', 0});
count.insert({'R', 0});
for(int c : s) count[c]++;
int i=0;
int n=s.size();
int k=n/4;
int res = n;
for(int j=0;j<n;++j) {
// 窗口外出现的次数
count[s[j]]--;
// 满足<=k
while(i<n && count['Q']<=k && count['W']<=k && count['E']<=k && count['R']<=k) {
// 取最小的结果
res = min(res, j-i+1);
// 直到不满足条件为止
count[s[i++]]++;
}
}
if (res == n) return 0;
return res;
}
};#滑动窗口