《编程之美》第2.19节:区间重合判断
问题:给定一个源区间[x,y](y>=x)和N个无序的目标区间[x1,y1]…[xn,yn],判断源区间[x,y]是不是在目标区间内?
解法:将目标区间排序,然后合并重合区间,最后用二分法查看源区间是否在目标区间内。
代码:
<span style="font-size:14px;">#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
struct Node
{
int begin;
int end;
Node(int b=0,int e=0):begin(b),end(e){}
bool operator<(const Node &node)const
{return begin==node.begin?end<node.end:begin<node.begin;}
};
bool segmentIncluded(list<Node> L,const Node &node)
{
L.sort();
list<Node>::iterator iter=L.begin();
list<Node>::iterator temp=L.begin();
for(++iter;iter!=L.end();)
{
if(temp->end>=iter->begin)
{
temp->end=iter->end;
iter=L.erase(iter);
}
else
{
temp=iter;
++iter;
}
}
for(iter=L.begin();iter!=L.end();++iter)
{
if(iter->begin<=node.begin && iter->end>=node.end)
return true;
}
return false;
}
int main()
{
list<Node> L;
L.push_back(Node(2,3));
L.push_back(Node(1,2));
L.push_back(Node(3,9));
bool result=segmentIncluded(L,Node(1,6));
cout<<result<<endl;
system("pause");
return 0;
}</span>
一下转自:http://blog.csdn.net/tianshuai1111/article/details/7828961解法比较巧妙
先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。
注意:下面这个代码GetIndex函数查找的是小于key的与key最接近的下标值,先找出与源区间[low,high]中low最接近的起始点,然后找到与high最接近的起始点,这两个起始点应该是一个点,否则[low,high]区间就不在目标区间内。
- #include <iostream>
- #include <algorithm>
- using namespace std;
- struct Line
- {
- int low, high;
- bool operator<(const Line &l) const