编程之美2.19区间重合判断

来源:互联网 发布:iptv和网络电视哪个好 编辑:程序博客网 时间:2024/05/16 15:40

比较好的解题思路

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;}


原创粉丝点击