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;
    }
};
posted @ 2021-05-07 11:55  童年の波鞋  阅读(42)  评论(0编辑  收藏  举报