Giả sử chúng ta có một mảng các khoảng (intervals). Với mỗi khoảng i, kiểm tra xem có tồn tại khoảng j nào mà điểm bắt đầu của j lớn hơn hoặc bằng điểm kết thúc của i (j nằm "phải" của i). Với mỗi i, lưu chỉ số của khoảng j có điểm bắt đầu nhỏ nhất thỏa mãn điều kiện. Nếu không tồn tại, lưu -1. Cuối cùng trả về mảng các giá trị đã lưu.
Ví dụ: [[3,4], [2,3], [1,2]] → [-1, 0, 1]. Không có khoảng phải cho [3,4]. Với [2,3], khoảng [3,4] có điểm bắt đầu nhỏ nhất; với [1,2], khoảng [2,3] có điểm bắt đầu nhỏ nhất.
Để giải quyết, chúng ta làm theo các bước:
n := kích thước intervals, tạo mảng ret kích thước n điền -1, tạo map m.
Với i từ 0 đến kích thước intervals: nếu intervals[i][0] đã có trong m thì bỏ qua; m[intervals[i][0]] = i+1.
Với i từ n-1 xuống 0: it = m.lower_bound(intervals[i][1]); nếu it->second == 0 thì bỏ qua; ret[i] = it->second - 1.
Trả về ret.
Ví dụ (C++)
Hãy xem triển khai sau để hiểu rõ hơn:
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
class Solution {
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
int n = intervals.size();
vector <int> ret(n, -1);
map <int, int> m;
for(int i = 0; i < intervals.size(); i++){
if(m.count(intervals[i][0])) continue;
m[intervals[i][0]] = i + 1;
}
for(int i = n - 1; i >= 0; i--){
map <int, int> :: iterator it = m.lower_bound(intervals[i][1]);
if(it->second == 0) continue;
ret[i] = it->second - 1;
}
return ret;
}
};
int main(){
vector<vector<int>> v = {{3,4},{2,3},{1,2}};
Solution ob;
print_vector(ob.findRightInterval(v));
}
Đầu vào
[[3,4],[2,3],[1,2]]
Đầu ra
[-1,0,1]