597 字
3 分钟
Day20260309

Day20260309#

滑动窗口最大值#

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

题解#

一眼单调队列的题目

class Solution {
public:
deque<int> dq;
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
for(int i=0;i<k;i++){
while( !dq.empty() && nums[i] > nums[dq.back()]){
dq.pop_back();
}
dq.push_back(i);
}
vector<int> ans;
ans.push_back(nums[dq.front()]);
for(int i=1;i<nums.size()-k+1;i++){
while( !dq.empty() && nums[i+k-1] > nums[dq.back()]){
dq.pop_back();
}
dq.push_back(i+k-1);
while(dq.front() < i){
dq.pop_front();
}
ans.push_back(nums[dq.front()]);
}
return ans;
}
};

最小覆盖字串#

给定两个字符串 s 和 t,长度分别是 m 和 n,返回 s 中的 最短窗口 子串,使得该子串包含 t 中的每一个字符(包括重复字符)。如果没有这样的子串,返回空字符串 ""

题解#

对于这样无顺序的字符集,首先考虑的就是hash 先对t字符串用一个hash表记录其中的字符个数,再使用一个hash表动态的记录s串滑动窗口内的字符数量

然后使用滑动窗口,用两个指针,先不断增大r指针,直到s串的哈希表覆盖t串哈希表,然后再增大l指针缩小滑动窗口,直到最小。l再增大1。最后重复上述操作,直到r到s末尾。

class Solution {
public:
typedef unordered_map<char,int> Hashmap;
bool check(Hashmap& sMap,Hashmap& tMap){
for(auto i:tMap){
if(sMap.find(i.first) == sMap.end()){
return false;
}else if(sMap[i.first] < i.second){
return false;
}
}
return true;
}
string minWindow(string s, string t) {
if(t.size() > s.size() ) return "";
Hashmap tMap;
Hashmap sMap;
for(int i=0;i<t.size();i++){
tMap[t[i]] ++;
}
int l=0,r=0;
vector<string> ans;
while( r < s.size() && l < s.size()){
while(!check(sMap,tMap) && r<s.size()){
sMap[s[r++]] ++;
}
if(r >= s.size()&&!check(sMap,tMap)) break;
while(check(sMap,tMap) && l < r){
sMap[s[l++]] --;
}
ans.push_back(s.substr(l-1,r-l+1));
}
if(ans.size() == 0) return "";
sort(ans.begin(),ans.end(),[](string& s1, string& s2){
return s1.size() < s2.size();
});
// for(auto i:ans) {
// cout<<i<<'\n';
// }
return ans[0];
}
};

合并区间#

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

题解#

对starti 排序,然后遍历,不是很难

class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),
[](vector<int>& v1,vector<int>& v2){
return v1[0] < v2[0];
});
vector<vector<int> > res;
int l = intervals[0][0],r = intervals[0][1];
for(auto item:intervals){
if(item[0] <= r){
r = max(item[1],r);
}else{
res.push_back({l,r});
l = item[0];
r = item[1];
}
}
res.push_back({l,r});
return res;
}
};
Day20260309
https://blog.eachic.me/posts/hot100/day20260309/
作者
Eachic
发布于
2026-03-09
许可协议
CC BY-NC-SA 4.0