[Google] Shortest Manhattan Distance - Shuatiblog.com


[Google] Shortest Manhattan Distance - Shuatiblog.com
给一个 n*m 的房间,房间里存在各种可能的墙,房间的格子里已经放了 e 个器材,要 求新放一个器材,放置位置距其它 e 个器材的距离最近。Breadth-first search.

对 e个设备 BFS, 求每个设备到每个可以放新器材的点的距离,然后叠加。
最后O(n2)一遍找最小值。复杂度O(e*n2)

As for whether we choose to check each equipment position, or check each vacant position, it’s decided by how many equipment is there. If very little equipments (e is small), then this solution should work.

However, what is there is obstacles in the matrix?

We have to use BFS then. It took more space usage, but the time complexity should be same.

public void findCenter(int[][] input, int numberOfEquip) {
    int m = input.length;
    int n = input[0].length;

    // there's gonna be m * n positions
    // we gonna cumulate (numberOfEquip) distances for each position
    int[] dis = new int[m * n];

    // from the input map, find Equipments
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (input[i][j] == 1) {
                // 1 represents equipment
                // when found, add the distance to every position
                cumulateDistance(i, j, dis, m, n);
            }
        }
    }

    // find the smallest cumulated distance from dis[].
    int sIndex = 0;
    int smallest = dis[0];
    for (int i = 0; i < m * n; i++) {
        if (dis[i] < smallest) {
            smallest = dis[i];
            sIndex = i;
        }
    }

    // index sIndex is the final answer
    System.out.println("Answer: " + (sIndex / n) + " " + (sIndex % n));
}

private void cumulateDistance(int x, int y, int[] dis, int m, int n) {
    for (int i = 0; i < m * n; i++) {
        int a = i / n;
        int b = i % n;
        dis[i] += Math.abs(a - x) + Math.abs(b - y);
    }
}
http://www.mitbbs.com/article_t/JobHunting/33054861.html
http://www.meetqun.com/thread-10926-1-1.html
用O(n * m * e) 可以做, 思路就是从每个器材点出发, 求该器材点到每个可以放置位置的距离, 然后把距离求和。 就形成了一个n * m的距离矩阵, 找距离矩阵中的最小值, 返回该点坐标。
  1.     def get_location(self, room):3 C+ M: r  m6 t: d( P! |& g
  2.         '''
  3.         time: O(n * m * k) k is num of equipments
  4.         space: O(k)
  5.         '''
  6.         m, n = len(room), len(room[0])& K2 |  X4 r9 D4 \* N! Y
  7.         equipments = set()# H. A) l' D" x) c! S
  8.         # find all equipments in the room
  9.         for i in xrange(m):! L4 x/ Q4 E- |5 {
  10.             for j in xrange(n):
  11.                 if room【i】[j] == 0:8 c7 R& G: v/ L/ g( f: c6 b
  12.                     equipments.add((i, j))7 i8 o% [* d0 h6 h# E- ~
  13.                 elif room【i】[j] == -1:4 N6 ^# n5 B  O, n- F" I( K1 [
  14.                     continue
  15.                 else:9 f1 x* u/ S3 Z+ a; l
  16.                     room【i】[j] = 0
  17.         # bfs all equipments locations to all avalibale locations
  18.         for i, j in equipments:
  19.             self.bfs(room, i, j)
  20.         2 ~) E1 T9 N% s
  21.         pos = [-1, -1]+ b4 A* z6 r6 J0 B: w! B2 ^4 V& Q
  22.         dis = 2**31 - 1
  23.         for i in xrange(m):& s8 N3 q# N3 R( p! E! j+ d$ d  {
  24.             for j in xrange(n):) c/ O$ J8 [: |0 v+ r
  25.                 if (i, j) in equipments or room【i】[j] < 0:! k7 ?3 z! P  r6 x  ~' j& o) Y
  26.                     continue0 H7 g/ h. Z% Z7 U: S+ t6 P9 v
  27.                 if room【i】[j] < dis:+ t% o- }/ Y7 p* U; W! \
  28.                     dis = room【i】[j]
  29.                     pos = [i, j]
  30.         return pos
  31. 4 {. ^6 a  U9 A2 I
  32.     def bfs(self, room, i, j):7 h: F8 O2 p' m- P1 ^7 c
  33.         queue = collections.deque()
  34.         queue.append((i, j, 0))) _2 |2 w: W9 X  A, Q. w; g( P
  35.         marked = set()
  36.         while queue:
  37.             mi, mj, distance = queue.popleft()
  38.             distance += 1( y. A4 k: `3 C% X  X9 d; w
  39.             # up* m% g& Q- E# o$ N; m4 @
  40.             if mi > 0 and room[mi - 1][mj] != -1 and (mi - 1, mj) not in marked:6 Y6 }( {6 a1 B' r; \4 T% m! d
  41.                 room[mi - 1][mj] += distance
  42.                 marked.add((mi - 1, mj))8 ?! e- v+ h9 a0 x( d
  43.                 queue.append((mi - 1, mj, distance))8 ~5 O: e9 Z! F( H2 n; |% V7 o
  44.             # down
  45.             if mi < len(room) - 1 and room[mi + 1][mj] != -1 and (mi + 1, mj) not in marked:( ^. v! F9 o3 m. B$ a. A3 ^8 c1 _
  46.                 room[mi + 1][mj] += distance
  47.                 marked.add((mi + 1, mj))- D2 E" S# i1 e6 Y+ {8 M, ~7 L6 x) K
  48.                 queue.append((mi + 1, mj, distance))& _9 F0 A9 Y8 q% g
  49.             # left  l. R& ^/ N8 @2 g
  50.             if mj > 0 and room[mi][mj - 1] != -1 and (mi, mj - 1) not in marked:1 s* i+ V5 i& e% m0 k
  51.                 room[mi][mj - 1] += distance
  52.                 marked.add((mi, mj - 1))" O9 v0 e, q) E- E5 x
  53.                 queue.append((mi, mj - 1, distance)); x( E6 U' N. @& Z( y) C
  54.             # right
  55.             if mj < len(room[0]) - 1 and room[mi][mj + 1] != -1 and (mi, mj + 1) not in marked:
  56.                 room[mi][mj + 1] += distance9 M  ?! O6 Y/ I1 f
  57.                 marked.add((mi, mj + 1))* V  e% a/ f" s, f" i9 k- D& v7 s
  58.                 queue.append((mi, mj + 1, distance))' G9 ~- s# h: 

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