一、概述
输入一个vector,元素是一个个整数对(a,b),代表区间[a,b]。
对于每一个区间,找到距离它右侧最近的区间。右侧定义为要求区间的左端点大于等于该区间的右端点,且它们的差最小。
二、分析
爆搜很简单,时间复杂度是O(n^2)。所以会超时。对于这种题,自然是先sort再找。
但是这道题就很麻烦,因为返回的是每个最近区间在vector中的索引。所以要把这个元素是vector的vector排序;并且用哈希表将元素和索引映射起来。最后在一个一个找。
思路很简单,但是实现起来很麻烦。
三、代码
class Solution {
//为了让unordered_map能将只含两个数的vector与int索引映射,首先需要将vector转为pair
//然后需要以下两个函数,一个是哈希函数,一个是判断相等函数,这样,map就能储存pair和int的映射了
struct Hashfunc {
size_t operator() (const pair<int,int>& key) const{
return hash<int>()(key.first) ^ hash<int>()(key.second);
}
};
struct Equalfunc {
bool operator() (const pair<int,int>& a, const pair<int,int>& b) const{
return a.first == b.first && a.second == b.second;
}
};
//这个函数用于sort能针对pair进行排序
static bool compare(pair<int,int> a,pair<int,int> b){
return a.first<b.first;
}
//这个函数用于lower_bound能针对pair排序
static bool compare1(pair<int,int> a,pair<int,int> b){
return b.second>a.first;
}
public:
vector<int> findRightInterval(vector<vector<int>>& intervals) {
vector<int> res;
vector<pair<int,int> >interval2pair;
//先把vector转为pair
for(int i=0;i<intervals.size();i++)
{
pair<int, int> p(intervals[i][0], intervals[i][1]);
interval2pair.push_back(p);
}
unordered_map<pair<int,int>,int,Hashfunc,Equalfunc> m;
//pair和int映射
for(int i=0;i<interval2pair.size();i++)
m[interval2pair[i]]=i;
//对pair排序
sort(interval2pair.begin(),interval2pair.end(),compare);
for(int i=0;i<intervals.size();i++)
{
//在有序vector中找pair
pair<int, int> p(intervals[i][0], intervals[i][1]);
auto tmp=lower_bound(interval2pair.begin(),interval2pair.end(),p,compare1);
//int t=m[*tmp];
if(tmp==interval2pair.end())
res.push_back(-1);
else
res.push_back(m[*tmp]);
}
return res;
}
};
PS:麻烦死了