Find Right Interval

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem

For each interval find the minimum start index of any interval whose start >= this interval's end. Return -1 if none.

Solutions

# Python
import bisect

def findRightInterval(intervals):
    starts = sorted((s, i) for i, (s, _) in enumerate(intervals))
    start_vals = [s for s, _ in starts]
    result = []
    for _, e in intervals:
        pos = bisect.bisect_left(start_vals, e)
        result.append(starts[pos][1] if pos < len(starts) else -1)
    return result
// C++
vector<int> findRightInterval(vector<vector<int>>& intervals) {
    map<int,int> startIdx;
    for(int i=0;i<(int)intervals.size();i++) startIdx[intervals[i][0]]=i;
    vector<int> res;
    for(auto&iv:intervals){
        auto it=startIdx.lower_bound(iv[1]);
        res.push_back(it==startIdx.end()?-1:it->second);
    }
    return res;
}
// Java
public int[] findRightInterval(int[][] intervals) {
    TreeMap<Integer,Integer> map=new TreeMap<>();
    for(int i=0;i<intervals.length;i++) map.put(intervals[i][0],i);
    int[]res=new int[intervals.length];
    for(int i=0;i<intervals.length;i++){
        Integer key=map.ceilingKey(intervals[i][1]);
        res[i]=key==null?-1:map.get(key);
    }
    return res;
}
// JavaScript
function findRightInterval(intervals) {
    const sorted = intervals.map((iv, i) => [iv[0], i]).sort((a,b)=>a[0]-b[0]);
    return intervals.map(([,e]) => {
        let lo=0,hi=sorted.length;
        while(lo<hi){const mid=(lo+hi)>>1;if(sorted[mid][0]<e)lo=mid+1;else hi=mid;}
        return lo<sorted.length?sorted[lo][1]:-1;
    });
}

Complexity

  • Time: O(n log n)
  • Space: O(n)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro