Google – Find a Path Among Circles


Google – Find a Path Among Circles
有一个通道,在y坐标0到1之间:
y = 1 —————————–
y = 0 —————————–
然后input一堆Circles,每个Circles有三个值,x, y, r, 分别表示圆心和半径。问题是在这条通道里是否能找出一条路径,可以从x的负无穷到正无穷。
路径不一定要直线,可以随便弯弯曲曲,但是如果有一个或者多个circle完全block了通道,就没有路径。
[Mistake]
一开始以为就是道Merge Interval的题目,合并每个圆的纵向interval, [y – r, y + r],一旦发现超过[0, 1]范围就返回false.
但是后来发现不是这样的:
比如一个圆在x = 0处,纵向interval为[0.5, 1.5],
另一个圆在x = 10000处,反正就是离的非常远,然后纵向interval为[-0.5, 0.9]
如果merge的话,肯定是超过[0, 1]范围,但是依然可以找出一条满足要求的路径。
所以这道题merge interval是有条件的,只有当两个圆相交或者相切,才能merge它们的纵向interval。
[Solution]
其实说白了就是cluster circles。只要有一个cluster的纵向interval超过范围了,就返回false。
Merge Intervals的变形,只有相交或者相切才merge,需要O( n2 ) time,因为每处理一个circle,都要和之前处理过的所有circle判断是否相交。
注意不能通过单纯通过sort x来判断是否相交,sort后第i个圆甚至可能出现和第i – 2个圆相交,但是和i – 1的圆没有半毛钱关系的情况。所以暂时没有想到比quadratic time更好的解法。
另外相交相切的条件:
圆心距离 < r1 + r2 相交
圆心距离 = r1 + r2 相切
圆心距离 > r1 + r2 相离
class Circle {
  double x;
  double y;
  double r;
  Circle(double x, double y, double r) {
    this.x = x;
    this.y = y;
    this.r = r;
  }
}
class Solution {
  public boolean hasPath(Circle[] circles) {
    if (circles == null || circles.length == 0) {
      return true;
    }
    Map<Circle, Interval> map = new HashMap<>();
    map.put(circles[0], new Interval(circles[0].y - circles[0].r, circles[0].y + circles[0].r));
    for (int i = 1; i < circles.length; i++) {
      boolean hasIntersection = false;
      Interval newInterval = new Interval(circles[i].y - circles[i].r, circles[i].y + circles[i].r);
      for (int j = 0; j < i; j++) {
        if (isIntersect(circles[j], circles[i])) {
          merge(map.get(circles[j]), newInterval);
          if (map.get(circles[j]).s <= 0 && map.get(circles[j]).e >= 1) {
            return false;
          }
          map.put(circles[i], map.get(circles[j]));
          hasIntersection = true;
        }
      }
// maybe first get all intersect intervals and merge them at same time
// after for loop, update all intervals to the merged interval
      if (!hasIntersection) {
        map.put(circles[i], newInterval);
      }
    }
    return true;
  }
  private boolean isIntersect(Circle a, Circle b) {
    double x = Math.abs(a.x - b.x);
    double y = Math.abs(a.y - b.y);
    double len = Math.sqrt(x * x + y * y);
    return len <= a.r + b.r;
  }
  // If intersect, there must be an overlap
  private void merge(Interval interval, Interval newInterval) {
    interval.s = Math.min(interval.s, newInterval.s);
    interval.e = Math.max(interval.e, newInterval.e);
  }
  private class Interval {
    double s;
    double e;
    Interval(double s, double e) {
      this.s = s;
      this.e = e;
    }
  }
}
Read full article from Google – Find a Path Among Circles

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