题意:给出一系列区间,找出每个区间最近的右区间。
思路:先将区间按左边界排序,然后用二分法快速查找所求区间。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<pair<int, int> >myInter;
vector<int> findRightInterval(vector<Interval>& intervals) {
for(int i = 0; i < intervals.size(); ++ i) {
pair<int, int> temp;
temp.first = i;
temp.second = intervals[i].start;
myInter.push_back(temp);
}
std::sort(myInter.begin(), myInter.end(), [](pair<int, int> a, pair<int, int> b) {return a.second < b.second;});
//cout << myInter[myInter.size() - 1].start;
vector<int> re(myInter.size(), -1);
if(intervals.size() == 0) return re;
for(int i = 0; i < intervals.size(); ++ i) {
re[i] = myfind(intervals[i].end);
}
return re;
}
int myfind(int end) {
if(end > myInter[myInter.size() - 1].second) return -1;
//cout << "here";
int low = 0;
int high = myInter.size() - 1;
while(low != high) {
int mid = low + (high - low) / 2;
if(myInter[mid].second >= end) high = mid;
else low = mid + 1;
}
return myInter[low].first;
}
};