Description Link to heading

1851. Minimum Interval to Include Each Query (Hard)

Solution Link to heading

First, it should be noted that sorting the intervals array will not affect the result. Secondly, sorting the queries array will not have a significant impact on the answer. It merely changes the order of the answers. We just need to associate the result of each query with its corresponding index in the original queries array.

For convenience, let’s convert the queries array into a vector<pair<int, int>> qrs; where the first element represents the value to be queried, and the second element represents its index in the queries array. Then, we sort the qrs vector in ascending order based on the first element.

Next, we prepare to iterate through the qrs vector. Since the intervals array is already sorted in ascending order based on the left endpoint, we compare the current query with intervals[idx][0]. If intervals[idx][0] <= query, we enqueue the intervals (fulfilling half of the required conditions), and increment idx to indicate that we have considered this interval. We continue this process until idx >= queries.size() or intervals[idx][0] > query.

Next, we compare the current query with the right endpoint of the top interval in the heap (where the top interval has the smallest length). If the right endpoint is smaller than query, we pop the interval out of the heap until the heap is empty or the right endpoint of the top interval is >= query.

Finally, we can update the minimum interval length corresponding to the query.

Code Link to heading

class Solution {
  public:
    vector<int> minInterval(vector<vector<int>> &intervals, vector<int> &queries) {
        sort(intervals.begin(), intervals.end());
        using pii = pair<int, int>;
        vector<pii> qrs;
        int m = intervals.size(), n = queries.size();
        for (int i = 0; i < n; ++i) {
            qrs.emplace_back(queries[i], i);
        }
        std::sort(qrs.begin(), qrs.end());
        vector<int> ans(n, -1);
        priority_queue<pii, vector<pii>, greater<pii>> pq; // pair.first => right - left + 1,pair.second => right
        int idx = 0;
        for (int i = 0; i < n; ++i) {
            while (idx < m && intervals[idx][0] <= qrs[i].first) {
                pq.push({intervals[idx][1] - intervals[idx][0] + 1, intervals[idx][1]});
                ++idx;
            }
            while (!pq.empty() && pq.top().second < qrs[i].first) {
                pq.pop();
            }
            if (!pq.empty()) {
                ans[qrs[i].second] = pq.top().first;
            }
        }
        return ans;
    }
};