开始我首先想到的是暴力求解,时间复杂度为O(N^2),结果超时了
错误代码示范:
class Solution {
public:
vector<int> findRightInterval(vector<Interval>& intervals)
{
int n=intervals.size();
int i,j;
vector<int>res(n,-2);
for(i=0;i<n;i++)
{
int distance=INT_MAX;
for(j=0;j<n;j++)
{
if(j==i)
continue;
else
{
if(intervals[j].start>=intervals[i].end)
{
if(intervals[j].start==intervals[i].end)
{
res[i]=j;
break;
}
else
{
if(intervals[j].start-intervals[i].end<distance)
{
distance=intervals[j].start-intervals[i].end;
res[i]=j;
}
}
}
}
}
if(res[i]==-2)
res[i]=-1;
}
return res;
}
};
第二种方法:
将所有的元素按照start为关键元素,进行升序排序。只要某个interval的start大于当前元素end,就返回该元素的下标。因此首先在排序前要将原始序列的下标存储起来,方便找到后返回。
class Solution {
public:
static bool comp(const pair<Interval,int> &a,const pair<Interval,int> &b)
{
if(a.first.start==b.first.start)
return a.first.end<=b.first.end;
else
return a.first.start<b.first.start;
}
vector<int> findRightInterval(vector<Interval>& intervals)
{
int n=intervals.size();
int i,j;
vector<pair<Interval,int> >index;
for(i=0;i<n;i++)
index.push_back(make_pair(intervals[i],i));
sort(index.begin(),index.end(),comp);
vector<int>ret(n,-1);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(index[j].first.start>=index[i].first.end)
{
ret[index[i].second]=index[j].second;
break;
}
}
return ret;
}
};