编程之美2.19区间重合判断

比较好的解题思路

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值