二、数组2(滑动窗口)
209. 长度最小的子数组
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 滑动窗口
int l = 0;
int r = 0;
int ans = nums.size()+1; // 记录最小长度
int sum = nums[l];
while(l<nums.size()){
if(sum<target && r<nums.size()-1){
++r;
sum += nums[r];
}
else{
sum -= nums[l];
++l;
}
if(sum>=target){
ans = min(ans, (r-l+1));
}
}
if(ans==nums.size()+1)
return 0;
return ans;
}
};
3. 无重复字符的最长子串
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.empty())
return 0;
// 滑动窗口
int freq[256] = {0}; // 记录字符出现的次数
int ans = 0;
int l = 0;
int r = -1;
while(l<s.size()){
if(r+1<s.size() && freq[s[r+1]]==0){
++r;
++freq[s[r]];
}
else{
--freq[s[l]];
++l;
}
ans = max(ans, (r-l+1));
}
return ans;
}
};
438. 找到字符串中所有字母异位词
class Solution {
public:
// 滑动窗口
bool isSame(const vector<int>& freq_p, const vector<int>& freq_s){
for(int i=0; i<26; ++i){
if(freq_p[i] != freq_s[i])
return false;
}
return true;
}
vector<int> findAnagrams(string s, string p) {
vector<int> freq_p(26, 0);
vector<int> freq_s(26, 0);
vector<int> ans;
// 先确定q中字母出现的次数
for(int i=0; i<p.size(); ++i)
++freq_p[p[i]-'a'] ;
// 在s中使用大小为len_p的窗口进行判断是否为字母异序词
int l = 0;
int r = -1;
while(r+1 < s.size()){
++r;
++freq_s[s[r]-'a'];
if(r-l+1>p.size()){
--freq_s[s[l]-'a'];
++l;
}
if(r-l+1==p.size() && isSame(freq_p, freq_s)){
ans.push_back(l);
}
}
return ans;
}
};
76. 最小覆盖子串
暂时不会呀!!