算法设计与分析 1.4 区间
题目描述
有一天,杰哥在数轴上玩游戏,杰哥有N个区间,第i个区间的端点是li和ri,即第i个区间覆盖了[li,ri],他想知道是否存在一个编号最小的区间包含所有的区间。如果存在,则输出区间编号,否则输出"-1".
区间包含指的是,假设一个区间[a,b]包含另外一个区间[c,d],需要满足a<=c<=d<=b.
输入格式
第一行一个整数N表示区间个数,N<=100000
接下去N行每行2个整数li,ri表示第i个区间的端点,1<=li<=ri<=1000000000
对于30%的数据,N<=100, 1<=li<=ri<=100
对于80%的数据,N<=1000, 1<=li<=ri<=1000
对于100%的数据,N<=100000, 1<=li<=ri<=1000000000
输出格式
一个整数表示满足要求区间的编号。若不存在则输出-1。
样例输入1
3
1 1
2 2
3 3
样例输出1
-1
样例输入2
6
1 5
2 3
1 10
7 10
7 7
10 10
样例输出2
3
参考代码
#include <iostream>
// 找到左边最小和右边最大,记录下他们的下标;
// 匹配下标,有一样则输出下标,否则-1;
// o(n)?
/*
数组L和数组R;
每次输入li,判断是否为最小值,是则在L数组中记录编号i;
每次输入ri,判断是否为最大值,是则在R数组中记录编号i;
同时遍历L和R;
如果L[j]<R[k],则j++;
如果L[j]>R[k],则k++;
相等,则输出L[j];
如果都没有则输出-1;
o(n)
*/
int main()
{
int N;
std::cin>>N;
long L[N],R[N];
long min=1000000000,max=0,li,ri;
int lenL=0,lenR=0;
for(int i=1;i<=N;i++){
std::cin>>li>>ri;
if(li<min){
min=li;
lenL=0;
L[lenL++]=i;
}
else if(li==min){
L[lenL++]=i;
}
if(ri>max){
max=ri;
lenR=0;
R[lenR++]=i;
}
else if(ri==max){
R[lenR++]=i;
}
}
int j=0,k=0;
while(j<lenL&&k<lenR){
if(L[j]==R[k]){
std::cout<<L[j];
return 0;
}
else if(L[j]<R[k]){
j++;
}
else{
k++;
}
}
std::cout<<-1;
}