Input:
intervals = [[1,2]]
Output:
[-1]
Explanation: There is only one interval in the collection, so it outputs -1.
Example 2:
1
2
3
4
5
6
7
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:
1
2
3
4
5
6
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.
For each interval, we want to find the interval with the smallest start time that is greater than or equal to its end time. By sorting the intervals by start time and using binary search, we can efficiently find the right interval for each query.
classSolution {
public: vector<int> findRightInterval(vector<vector<int>>& intervals) {
int n = intervals.size();
vector<pair<int, int>> starts;
for (int i =0; i < n; ++i) {
starts.emplace_back(make_pair(intervals[i][0], i));
}
sort(starts.begin(), starts.end());
vector<int> res;
for (auto interval : intervals) {
int left =0, right = n -1;
int end = interval[1];
while (left < right) {
int mid = left + right >>1;
if (starts[mid].first >= end)
right = mid;
else left = mid +1;
}
res.push_back(starts[left].first < end ?-1: starts[left].second);
}
return res;
}
};
classSolution {
publicint[]findRightInterval(int[][] intervals) {
int n = intervals.length;
List<int[]> starts =new ArrayList<>();
for (int i = 0; i < n; ++i) {
starts.add(newint[] {intervals[i][0], i});
}
starts.sort(Comparator.comparingInt(a -> a[0]));
int[] res =newint[n];
int i = 0;
for (int[] interval : intervals) {
int left = 0, right = n - 1;
int end = interval[1];
while (left < right) {
int mid = (left + right) >> 1;
if (starts.get(mid)[0]>= end) {
right = mid;
} else {
left = mid + 1;
}
}
res[i++]= starts.get(left)[0]< end ?-1 : starts.get(left)[1];
}
return res;
}
}
classSolution {
funfindRightInterval(intervals: Array<IntArray>): IntArray {
val n = intervals.size
val starts = Array(n) { intArrayOf(intervals[it][0], it) }
starts.sortBy { it[0] }
val res = IntArray(n)
for ((idx, interval) in intervals.withIndex()) {
var left = 0var right = n - 1val end = interval[1]
while (left < right) {
val mid = (left + right) shr 1if (starts[mid][0] >= end) {
right = mid
} else {
left = mid + 1 }
}
res[idx] = if (starts[left][0] < end) -1else starts[left][1]
}
return res
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution:
deffindRightInterval(self, intervals: List[List[int]]) -> List[int]:
for i, v in enumerate(intervals):
v.append(i)
intervals.sort()
n = len(intervals)
ans = [-1] * n
for _, e, i in intervals:
j = bisect_left(intervals, [e])
if j < n:
ans[i] = intervals[j][2]
return ans
impl Solution {
pubfnfind_right_interval(intervals: Vec<Vec<i32>>) -> Vec<i32> {
let n = intervals.len();
letmut starts: Vec<(i32, usize)>= intervals.iter().enumerate().map(|(i, v)| (v[0], i)).collect();
starts.sort_by_key(|x| x.0);
letmut res = Vec::with_capacity(n);
for interval in&intervals {
let end = interval[1];
letmut left =0;
letmut right = n -1;
while left < right {
let mid = (left + right) /2;
if starts[mid].0>= end {
right = mid;
} else {
left = mid +1;
}
}
if starts[left].0< end {
res.push(-1);
} else {
res.push(starts[left].1asi32);
}
}
res
}
}