Friday, October 2, 2020

436. Find Right Interval ------M

 You are given an array of intervals, where intervals[i] = [starti, endi] and each starti is unique.

The right interval for an interval i is an interval j such that startj >= endi and startj is minimized.

Return an array of right interval indices for each interval i. If no right interval exists for interval i, then put -1 at index i.

 

Example 1:

Input: intervals = [[1,2]]
Output: [-1]
Explanation: There is only one interval in the collection, so it outputs -1.

Example 2:

Input: intervals = [[3,4],[2,3],[1,2]]
Output: [-1,0,1]
Explanation: There is no right interval for [3,4].
The right interval for [2,3] is [3,4] since start0 = 3 is the smallest start that is >= end1 = 3.
The right interval for [1,2] is [2,3] since start1 = 2 is the smallest start that is >= end2 = 2.

Example 3:

Input: intervals = [[1,4],[2,3],[3,4]]
Output: [-1,2,-1]
Explanation: There is no right interval for [1,4] and [3,4].
The right interval for [2,3] is [3,4] since start2 = 3 is the smallest start that is >= end1 = 3.

 

Constraints:

  • 1 <= intervals.length <= 2 * 104
  • intervals[i].length == 2
  • -106 <= starti <= endi <= 106
  • The start point of each interval is unique.

A:

就是先根据每个interval 的start 排序,然后再逐次往下一个找。

这个题的tricky地方是:要做好各种mapping .  我犯错的一点儿就是,一开始没有把query interval 的index  map好, 而直接用了push_back.  哎,恰好25分钟做完,还是不太够

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
    vector<int> findRightInterval(vector<vector<int>>& intervals) {
        unordered_map<int,int> M;// start_i --> its idex
        int n = intervals.size();
        for(int i =0; i<n;i++){
            M[intervals[i][0]] = i;
        }
        // Using assignment operator to copy one vector to other 
        sort(intervals.begin(), intervals.end());
        vector<int> res(n,0);
        for(int i =0;i< n;i++){
            int end = i+1;
            while(end<n && intervals[end][0] < intervals[i][1]){
                end++;
            }            
            res[M[intervals[i][0]]] = (end==n)?-1 :M[intervals[end][0]];
        }
        return res;
    }
};





No comments:

Post a Comment