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/