《编程之美》 2.19 区间重合判断
2012-09-11 14:19
337 查看
解法二的思路:
1 排序 O(N*logN) (N为目标区间的个数)
2 合并 O(N)
3 二分查找 O(k*logN) (k为合并后区间的个数)
1 排序 O(N*logN) (N为目标区间的个数)
2 合并 O(N)
3 二分查找 O(k*logN) (k为合并后区间的个数)
// 2.19.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<vector> #include<algorithm> using namespace std; struct area { int begin; int end; }; bool compare(area& a,area& b) { return a.begin<b.begin; } int _tmain(int argc, _TCHAR* argv[]) { int arr[] = {2, 5, 3, 4, 3, 9, 11, 15}; vector<area> vec; area a; for(int i=0;i<sizeof(arr)/sizeof(arr[0]);) { a.begin=arr[i++]; a.end=arr[i++]; vec.push_back(a); } sort(vec.begin(),vec.end(),compare);//排序 // cout << "after sort: " << endl; for (int i = 0; i < vec.size(); i ++) cout << "(" << vec[i].begin << ", " << vec[i].end << ") "; cout << endl; // //合并 for(int i=1;i<vec.size();) { if(vec[i].begin<=vec[i-1].end && vec[i].end>=vec[i-1].end) { vec[i-1].end=vec[i].end; vec.erase(vec.begin()+i); } else if(vec[i].begin<=vec[i-1].end && vec[i].end<vec[i-1].end) { vec.erase(vec.begin()+i); } else ++i; } // cout << "after merger :" << endl; for (int i = 0; i < vec.size(); i ++) cout << "(" << vec[i].begin << ", " << vec[i].end << ") "; cout << endl; //二分查找 area target;//设置源区间 target.begin=2; target.end=8; int first=0; int last=vec.size()-1; bool flag=false; while(first<=last) { int mid=(first+last)/2; if(vec[mid].begin<=target.begin&&vec[mid].end>=target.end) { flag=true; break; } else if(vec[mid].end<target.begin) first=mid+1; else if(vec[mid].begin>target.end) last=mid-1; else break; } if(flag) cout<<"true"<<endl; else cout<<"false"<<endl; return 0; }
相关文章推荐
- 区间重合判断-编程之美2.19
- 《编程之美》学习笔记——2.19区间重合判断
- 编程之美 2.19 区间重合判断
- 编程之美:第二章 数字之魅 2.19区间重合判断
- 编程之美2.19—区间重合判断
- 区间重合判断(编程之美2.19)
- 编程之美2.19——区间重合判断(线段树)
- 编程之美——2.19 区间重合判断
- 编程之美2.19——区间重合判断(线段树)
- 编程之美2.19区间重合判断
- 编程之美-2.19-区间重合判断
- [编程之美] PSet2.19 区间重合判断
- 2.19 区间重合判断
- 编程之美——区间重合判断
- 编程之美 2.19 区间重合判断
- 2.19 区间重合判断
- 读书笔记之编程之美 - 2.19 区间重合判断
- 【编程之美】2.19 区间重合判断
- 编程之美--区间重合判断
- 【编程之美】区间重合判断(线段树)