常见模型:找出滑动窗口中的最大值/最小值
int hh = 0, tt = -1;
for (int i = 0; i < n; i ++ )
{
while (hh <= tt && check_out(q[hh])) hh ++ ; // 判断队头是否滑出窗口
while (hh <= tt && check(q[tt], i)) tt -- ;
q[ ++ tt] = i;
}
推荐题目:
LeetCode
209.长度最小的子数组(中等)
int minSubArrayLen(int target, vector<int>& nums) {
int sum=0;
int res=INT32_MAX;
for(int i=0,j=0;j<nums.size();j++){
sum+=nums.at(j);
while(sum>=target) {
res=min(res,j-i+1);
sum-=nums.at(i);
i++;
}
}
if(res==INT32_MAX){
return 0;
}else{
return res;
}
}
904.水果成篮(中等)
int totalFruit(vector<int>& nums) {
int res=0;
unordered_map<int,int >cnt;
for(int i=0,j=0,s=0;i<nums.size();i++){
if(++cnt[nums[i]]==1) s++;
if(s>2){
if(--cnt[nums[j]]==0) s--;
j++;
}
res=max(res,i-j+1);
}
return res;
}
string minWindow(string s, string t) {
unordered_map<char ,int > hs,ht;
for(auto c:t) ht[c]++;
int cnt=0;
string res;
for(int i=0, j=0;i<s.size();i++){
hs[s[i]]++;
if(hs[s[i]]<=ht[s[i]]) cnt++;
while(hs[s[j]]>ht[s[j]]) hs[s[j++]]--;
if(cnt == t.size()){
if(res.empty()||(i-j+1)<res.size()) {
res=s.substr(j,i-j+1);
}
}
}
return res;
}