题目地址:
https://leetcode.com/problems/find-right-interval/description/
给定 n n n个区间组成的数组 A A A,对每个数组,求左端点大于等于其右端点且左端点最靠左的区间的下标。题目保证每个区间左端点各不相同。
记录一下每个左端点对应的区间下标,然后按左端点从小到大排序,接着枚举每个区间,二分求左端点大于等于其右端点且左端点最小的区间。代码如下:
class Solution {public:vector<int> findRightInterval(vector<vector<int>>& a) {int n = a.size();vector<int> res(n, -1);unordered_map<int, int> mp;for (int i = 0; i < n; i++) mp[a[i][0]] = i;sort(a.begin(), a.end());for (int i = 0; i < n; i++) {int l = i, r = n - 1;if (l > r) continue;while (l < r) {int mid = l + (r - l >> 1);if (a[mid][0] >= a[i][1]) r = mid;else l = mid + 1;}if (a[l][0] >= a[i][1]) res[mp[a[i][0]]] = mp[a[l][0]];}return res;}
};
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( n ) O(n) O(n)。