比较好的解题思路
http://blog.csdn.net/linyunzju/article/details/7737060
问题:
1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。
2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。
1. 解法:
先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,用二分查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。
自己的解法
#include <iostream>
#include <vector>
using namespace std;
struct zone{
int left;
int right;
};
void sort(vector<zone>& vec){
for(int i=vec.size()-1;i>=1;i--){
for(int j=0;j<i;j++){
if(vec[j].left>vec[j+1].left){
int templeft = vec[j].left;
vec[j].left = vec[j+1].left;
vec[j+1].left = templeft;
int tempright = vec[j].right;
vec[j].right = vec[j+1].right;
vec[j+1].right = tempright;
}
}
}
for(i=vec.size()-1;i>=1;i--){
for(int j=0;j<i;j++){
if((vec[j].left==vec[j+1].left)&&(vec[j].right>vec[j+1].right)){
int temp = vec[j].right;
vec[j].right = vec[j+1].right;
vec[j+1].right = temp;
}
}
}
}
void check(zone z,vector<zone> vec){
vector<zone> area;
sort(vec);
for(int i=0;i<vec.size();i++){
cout<<vec[i].left<<" "<<vec[i].right<<endl;
}
int start=vec[0].left,end=vec[0].right;
zone newz = {start,end};
for(i=1;i<vec.size();i++){
if(vec[i].left<=end){
end = vec[i].right;
}else{
newz.left = start;
newz.right = end;
area.push_back(newz);
start = vec[i].left;
end = vec[i].right;
}
}
newz.left = start;
newz.right = end;
area.push_back(newz);
for(i=0;i<area.size();i++){
if(z.left>=area[i].left&&z.right<=area[i].right){
cout<<z.left<<" "<<z.right<<"°üº¬ÔÚ"<<area[i].left<<" "<<area[i].right<<endl;
break;
}
}
}
int main(){
zone z = {3,7};
zone z1 = {1,2};
zone z2 = {3,6};
zone z3 = {5,9};
vector<zone> vec;
vec.push_back(z2);
vec.push_back(z1);
vec.push_back(z3);
check(z,vec);
return 0;
}