每日一题(21)――区间重合检测(一)(普通区间合并&并查集) - 小熊不去实验室 - 博客频道 - CSDN.NET


给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内
解法1:
先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,二分法查出其左右两边界点分别处于合并后的哪个源区间中O(logn),若属于同一个源区间则说明其在目标区间中,否则就说明不在。
  1. struct region  
  2. {
  3.     int start;  
  4.     int over;  
  5.     bool operator<(const region& r) const  
  6.     {return start<r.start;}  
  7. };  
  8. //binary-research by merged[].start to find the most nearly merged[].start  
  9. int check(region m[],int length,int testId)  
  10. {  
  11.     int low=0,high=length+1;  
  12.     int mid;  
  13.     while(low<=high)  
  14.     {  
  15.         mid=(low+((high-low)>>1));  
  16.         if(m[mid].start <= testId) low=mid+1;  
  17.         else  
  18.             high=mid-1;  
  19.     }  
  20.     return high;//返回的是high值,此时high小于等于mid,小于low;  
  21. }  
  22. int main()  
  23. {  
  24.     region r[30],merged[30],test;  
  25.     int n;//count of array  
  26.     int m;//conut of merged array  
  27.     cin>>n;  
  28.     for(int i=0; i<n; i++)  
  29.         cin>>r[i].start>>r[i].over;  
  30.     cin>>test.start>>test.over;  
  31.   
  32.     sort(r,r+n);//sort by start time  
  33.     cout<<endl;  
  34.     cout<<"Sorted Region: "<<endl;  
  35.     for(int i=0;i<n;i++) cout<<r[i].start<<" "<<r[i].over<<endl;  
  36.     cout<<endl;  
  37.     //mergeRegions;  
  38.     m=0;  
  39.     int lasthigh = r[0].over;  
  40.     merged[0].start = r[0].start;  
  41.     merged[0].over = r[0].over;  
  42.     for (int i=1; i<n; i++)  
  43.     {  
  44.         if (lasthigh >= r[i].start)//注意:>= 合并操作  
  45.         {  
  46.             lasthigh = lasthigh>r[i].over?lasthigh:r[i].over;//lasthigh等于较大值  
  47.             merged[m].over = lasthigh;  
  48.         }  
  49.         else //扩展一个新的区间  
  50.         {  
  51.             m++;  
  52.             merged[m].start = r[i].start;  
  53.             merged[m].over = r[i].over;  
  54.             lasthigh = r[i].over;  
  55.         }  
  56.     }  
  57.     cout<<"Merged Region: "<<endl;  
  58.     for(int i=0;i<=m;i++) cout<<merged[i].start<<" "<<merged[i].over<<endl;  
  59.     cout<<endl;  
  60.     //check the test line binary-research  
  61.     int startId = check(merged, m, test.start);  
  62.     int overId = check(merged, m, test.over);  
  63.     if(startId==overId && test.over<=merged[overId].over)  
  64.         cout<<"OK! The test line is in the set."<<endl;  
  65.     else  
  66.         cout<<"False! The test line is not in the set."<<endl;  
解法2:
利用并查集,首先初始化每个元素的代表节点father[i]=i等于其本身,count[i]=1;然后每输入一个区间,合并一次(遍历区间内的每一个元素,更新其代表);最后查询待查区间的首位两个元素是否在同一区间内。这种方法将区间转化为离散的集合,操作容易,但是浪费空间比较严重,对于大规模的区间不太实用。
  1. int father[SIZE];  
  2. int count[SIZE];  
  3.   
  4. void initail(int num)  
  5. {  
  6.     for (int i=0; i<num; i++)  
  7.     {  
  8.         father[i]=i;//每个集合的代表是自己  
  9.         count[i]=1; //代表一个元素  
  10.     }  
  11. }  
  12.   
  13. void merge(int x, int y)  
  14. {  
  15.     if(father[x]==father[y])  
  16.         return;  
  17.     else  
  18.     {  
  19.         if(count[x]>=count[y])  
  20.         {  
  21.             father[y]=father[x];  
  22.         }  
  23.         else  
  24.             father[x]=father[y];   
  25.         count[father[x]]++;  
  26.     }  
  27. }  
  28. int main()  
  29. {  
  30.     memset(father,-1,sizeof(father));  
  31.     memset(count,1,sizeof(count));  
  32.     int n,t0,t1;  
  33.     cin>>n;  
  34.     initail(SIZE);//需要初始化整个可能的区间  
  35.     while(n--)  
  36.     {  
  37.         cin>>t0>>t1;  
  38.         if(t0>t1)  
  39.             swap(t0,t1);  
  40.         for(int i=t0+1; i<=t1; i++)  
  41.             merge(t0,i);  
  42.     }  
  43.     int test0,test1;  
  44.     cin>>test0>>test1;  
  45.   
  46.     if(father[test0]==father[test1])  
  47.         cout<<"Yes"<<endl;  
  48.     else  
  49.         cout<<"No"<<endl;  
  50. }
Read full article from 每日一题(21)――区间重合检测(一)(普通区间合并&并查集) - 小熊不去实验室 - 博客频道 - CSDN.NET

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts