题目链接:https://leetcode-cn.com/problems/find-right-interval/
以“左端点优先升序,右端点其次升序”的顺序对二维数组排序(要注意记录下标,因为最后要按原顺序输出)。
遍历,二分搜索最小的满足条件左端点即可。
代码如下:
class Solution {
public:
//新学到的,调用时要加 static 声明静态函数
static bool cmp(vector<int> v1, vector<int> v2) {
if(v1[0] == v2[0]) {
return v1[1] < v2[1];
} else {
return v1[0] < v2[0];
}
}
vector<int> findRightInterval(vector<vector<int>>& intervals) {
// 存储位置
for(int i = 0; i < intervals.size(); i++) {
intervals[i].push_back(i);
}
sort(intervals.begin(), intervals.end(), cmp);
vector<int> ans(intervals.size(), -1);
for(int i = 0; i < intervals.size(); i++) {
int res = INT_MAX;
int l = i + 1, r = intervals.size() - 1;
while(l <= r) {
int mid = (l + r) / 2;
if(intervals[mid][0] >= intervals[i][1]) {
//记录当前满足条件的最小值
res = min(res, mid);
printf("res = %d\n", res);
r = mid - 1;
} else {
l = mid + 1;
}
}
//printf("[%d, %d], index = %d, res = %d\n", intervals[i][0], intervals[i][1], intervals[i][2], res);
if(res != INT_MAX) {
ans[intervals[i][2]] = intervals[res][2];
}
}
return ans;
}
};