a_lc_包含每个查询的最小区间(反向思维:先排好序+数据结构优化查询)
给你一个整数数组 queries 。第 j 个查询的答案是在 ints 这个二维数组中找到满足 \(left_i <= queries[j] <= right_i\) 的 长度最小区间 i 的长度 。如果不存在这样的区间,那么答案是 -1 。
两个数组的长度都<=1e5
思路:一般我们都会先遍历 qs,然后再嵌套遍历 ints,但正确做法一般都是反着来:先将 ints 数组按照区间长度排序,然后对于第 i 个查询 qs[i],只要在 ints 中找到满足 ints[j][0] <= qs[i] <= ints[j][1] 即可,因为排完序之后,区间长度是最小的了,省去了这部分的消耗
class Solution {
public:
vector<int> minInterval(vector<vector<int>>& ints, vector<int>& qs) {
int n = qs.size();
vector<int> ans(n, -1);
set<pair<int, int>> st;
for (int i = 0; i < n; i++) {
st.insert({qs[i], i});
}
sort(ints.begin(), ints.end(), [](vector<int>& a, vector<int>& b) {return a[1] - a[0] < b[1] - b[0];});
for (auto& i : ints) {
auto q = st.lower_bound({i[0], -1});
while (q != st.end() && q->first <= i[1]) {
ans[q->second] = i[1] - i[0] + 1;
st.erase(q++);
}
}
return ans;
}
};