跳到主要内容

436.寻找右区间

链接:436.寻找右区间
难度:Medium
标签:数组、二分查找、排序
简介:返回一个由每个区间 i 的 右侧区间 的最小起始位置组成的数组。如果某个区间 i 不存在对应的 右侧区间 ,则下标 i 处的值设为 -1 。

题解 1 - cpp

  • 编辑时间:2022-05-20
  • 执行用时:60ms
  • 内存消耗:23.3MB
  • 编程语言:cpp
  • 解法介绍:bs。
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>> &intervals) {
int n = intervals.size();
vector<int> ans(n, -1);
vector<int> list(n);
for (int i = 0; i < n; i++) list[i] = i;
sort(list.begin(), list.end(), [&](int &a, int &b) -> bool {
if (intervals[a][0] == intervals[b][0])
return intervals[a][1] < intervals[b][1];
return intervals[a][0] < intervals[b][0];
});
for (int i = 0; i < n; i++)
ans[i] = bs(intervals, list, intervals[i][1]);
return ans;
}
int bs(vector<vector<int>> &intervals, vector<int> &list, int num) {
int l = 0, r = intervals.size(), m;
while (l < r) {
m = (l + r) >> 1;
if (intervals[list[m]][0] >= num)
r = m;
else
l = m + 1;
}
if (r == intervals.size()) return -1;
return list[l];
}
};