1.4 区间

算法设计与分析 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值