Find Right Interval
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