最小区间
如果用滑动窗口,要先会做这道题,最小覆盖子串
这种求满足条件的最长区间或者最短区间问题,很多时候都可以用滑动窗口解决。
class Solution {
public:
map<int,vector<int>> mp;
vector<int> smallestRange(vector<vector<int>>& nums) {
vector<int> ans = {-100000,100000+1};
for(int i=0;i<nums.size();i++){
for(int j=0;j<nums[i].size();j++){
mp[ nums[i][j] ].push_back(i);;
}
}
vector<int> a;
for(auto it:mp){
a.push_back(it.first);
}
int k = nums.size(), cnt = 0, n = a.size();
vector<int> vis(k,0);
int l = 0, r = 0;
while(l<n){
while(r<n && cnt<k){
vector<int>& v = mp[ a[r] ];
for(int x:v){
if(vis[x]==0){
cnt++;
}
vis[x]++;
}
r++;
}
if(cnt==k){
if( (a[r-1]-a[l])<(ans[1]-ans[0]) || (a[r-1]-a[l])==(ans[1]-ans[0]) && a[r-1]<ans[1] )
ans = {a[l],a[r-1]};
}
vector<int>& v = mp[ a[l] ];
for(int x:v){
vis[x]--;
if(vis[x]==0){
cnt--;
}
}
l++;
}
return ans;
}
};
/*
k个列表
0: [-1, 2, 3]
1: [1]
2: [1, 2]
3: [1, 1, 1 ,3]
哈希映射
-1: [0]
1: [1, 2, 3, 3, 3]
2: [0, 2]
3: [0, 3]
*/