给你一个区间数组 intervals
,其中 intervals[i] = [starti, endi]
,且每个 starti
都 不同 。
区间 i
的 右侧区间 可以记作区间 j
,并满足 startj >= endi
,且 startj
最小化 。
返回一个由每个区间 i
的 右侧区间 的最小起始位置组成的数组。如果某个区间 i
不存在对应的 右侧区间 ,则下标 i
处的值设为 -1
。
输入: intervals = [[1,2]] 输出: [-1] 解释: 集合中只有一个区间,所以输出-1。
输入: intervals = [[3,4],[2,3],[1,2]] 输出: [-1,0,1] 解释: 对于 [3,4] ,没有满足条件的“右侧”区间。 对于 [2,3] ,区间[3,4]具有最小的“右”起点; 对于 [1,2] ,区间[2,3]具有最小的“右”起点。
输入: intervals = [[1,4],[2,3],[3,4]] 输出: [-1,2,-1] 解释: 对于区间 [1,4] 和 [3,4] ,没有满足条件的“右侧”区间。 对于 [2,3] ,区间 [3,4] 有最小的“右”起点。
1 <= intervals.length <= 2 * 104
intervals[i].length == 2
-106 <= starti <= endi <= 106
- 每个间隔的起点都 不相同
# @param {Integer[][]} intervals
# @return {Integer[]}
def find_right_interval(intervals)
starts = []
ends = []
i = 0
ret = [-1] * intervals.size
(0...intervals.size).each do |j|
starts.push([intervals[j][0], j])
ends.push([intervals[j][1], j])
end
starts.sort!
ends.sort!
(0...ends.size).each do |j|
i += 1 while i < ends.size && ends[j][0] > starts[i][0]
break if i >= ends.size
ret[ends[j][1]] = starts[i][1]
end
ret
end
impl Solution {
pub fn find_right_interval(intervals: Vec<Vec<i32>>) -> Vec<i32> {
let mut starts = vec![];
let mut ends = vec![];
let mut i = 0;
let mut ret = vec![-1; intervals.len()];
for j in 0..intervals.len() {
starts.push((intervals[j][0], j));
ends.push((intervals[j][1], j));
}
starts.sort_unstable();
ends.sort_unstable();
for j in 0..ends.len() {
while i < ends.len() && ends[j].0 > starts[i].0 {
i += 1;
}
if i >= ends.len() {
break;
}
ret[ends[j].1] = starts[i].1 as i32;
}
ret
}
}