LIKE CODING: MJ [27] Catch Thief


LIKE CODING: MJ [27] Catch Thief
A thief steals from n houses denoted from 0 to n-1. To avoid to be caught, the thief cannot stay in the same house in two successive days and can only move to the left or right house on the next day. For example, if the thief steals house 5 on day 8, he must move to house 4 or 6 one day 9.

The police is trying to catch the thief with a strategy. strategy[i] (i=0,...,k-1) indicates the house to be searched on day i. The police catches the thief if they are in the same house on the same day. Write a program to determine whether the police can catch the thief by the strategy.
http://www.mitbbs.com/article_t1/JobHunting/32978937_0_1.html
找小偷问题,有n个房间,其中一个房间有小偷。早上我们
可以打开一个房间的门看小偷在不在里面,晚上小偷会向左边或者右边的房间走。
现在给你一个开门的sequence,你输出这个sequence能不能保证找到小偷。
比如:如果只有三个房间那么如果打开房间的sequence是{1,1}那么一定会找到小偷。
因为如果小偷在中间那么第一天就会被找到,如果小偷在两边那么第二天一定回来
到中间也会被找到。房间数为n,sequence长度为k

跟着我开始brute force假设小偷在某个房间然后dfs所有路径,大概是O(n*n^k)。 
考官说好,如果考虑cut branch呢?跟着我就说可以拿一个n*k的matrix跟着根据
sequence来cut branch,reduce到O(n*n*k)。他说有没有可能同时从所有房间
开始呢?我说可以跟着直接在那个n*kmatrix上做一个类似dp的东西。跟着reduce 到 
O(n*k)。他说有没有可能把space reduce呢?我说可以我只要O(n)的space
跟着他就让我再写一个叫nextRow的function来实现O(n)space
nextDay[k][n] : 第k天,第n个房间小偷是否可以survive
nextDay[i][j] = (nextDay[i-1][j-1] or nextDay[i-1][j+1]) && strategy[i] != j

    // O(n*k) time, O(n) space
    boolean canCatchTheft(int n, int strategy[]) {
        int k = strategy.length;
        // nextDay[i] means theft can survive in spot i or not on this day
        boolean nextDay[] = new boolean[n]; 
        boolean canSurvive, pre, a, b;
        // init the first day
        Arrays.fill(nextDay, true); nextDay[strategy[0]] = false;
        for (int i = 1; i < k; ++i) { 
            canSurvive = false; pre = false;
            for (int j = 0; j < n; ++j) { 
                a = j == 0 ? false : pre;
                b = j == n - 1 ? false : nextDay[j + 1];
                pre = nextDay[j]; // store current day for the next round
                nextDay[j] = ((a || b) && strategy[i] != j) ? true : false;
                if(nextDay[j] == true) canSurvive = true; 
            }
            if (!canSurvive) return true;
        }
        return false;
    }

    // O(n*k) time, O(n) space
    boolean alibaba(int numCaves, int[] strategy) {
        // survival[i] means theft can be in spot i or not on this day
        boolean survival[] = new boolean[n + 2];
        
        // init the first day 
        // 在头尾加一个房间,且小偷不可能出现在这两个房间(为了处理下面j - 1
和j + 1越界的情况)
        Arrays.fill(survival, true);
        survival[0] = false;
        survival[n + 1] = false;
        survival[strategy[0]] = false;
        
        for (int i = 1; i < strategy.length; ++i) {
            for (int j = 1; j < n + 1; ++j) {
                survival[j] = ((survival[j - 1] || survival[j + 1]) && 
strategy[i] != j) ? true : false;
            }
        }
        
        // 最后survival数组保存小偷可能出现的房间,如果都为false表示经过这个
strategy寻找后小偷不可能在任何一个房间
        for(int i = 1; i < n + 1; ++i){
            if(survival[i]){
                return false;
            }
        }
        
        return true;
    }


    int closestValue(TreeNode* root, double target) {
        int ret = root->val;
        closestValue(root, target, ret);
        return ret;
    }
    void closestValue(TreeNode* root, double target, int &ret){
        if(root){
//            if(target == (double)(root->val)) {ret = target; return;}
            if(abs(root->val - target)<abs(ret - target))
                ret = root->val;
            if(target<(double)root->val)
                closestValue(root->left, target, ret);
            else
                closestValue(root->right, target, ret);
        }
    }
https://gist.github.com/gcrfelix/19e0dd64a7f8e9192158
就是ali baba是个怪兽,他可能在[0,1, ..., numCaves-1]出现,他每隔一天就要换
一个地方,但他每次只能移左右一格。
然后给你一个strategy[]数组,数组里面是猜测每天ali baba的位置。如果里面有一个
猜中了,这个strategy就是正确的。
问题就是让你写一个判断函数 alibaba(int numCaves, int[] strategy)来判别这个
strategy数组是不是稳赢的策略。写完后问时间复杂度,然后问了下大概怎么样可以优

*/
public class FindAlibaba {
   
// 可以用 res[i][j] 来表示 第j天在Cave i能不能捉到alibaba. 如果捉到,则为true, 否则为false
// 然后状态转换方程就是res[i][j] = res[i][j] || res[i - 1][j - 1] && res[i + 1][j - 1], 它的解依赖于往左跳一格和往右跳一格
// 然后最后再check res[i][days - 1]是不是全是true, 是的话就代表这个strategy稳赢
// 时间复杂度就是O(numCaves * len(strategy))
   
    public boolean alibaba(int numCaves, int[] strategy) {
        int days = strategy.length;
        boolean[][] res = new boolean[numCaves][days];
        for(int i=0; i<days; i++) {
            res[strategy[i]][i] = true;
        }
       
        for(int i=0; i<numCaves; i++) {
            for(int j=1; j<days; j++) {
                if(i == numCaves-1) {
                    res[i][j] = res[i][j] || res[i-1][j-1];
                } else if(i == 0) {
                    res[i][j] = res[i][j] || res[i+1][j-1];
                } else {
                    res[i][j] = res[i][j] || (res[i-1][j-1] && res[i+1][j-1]);
                }
            }
        }
       
        boolean result = true;
        for(int i=0; i<numCaves; i++) {
            if(!result) {
                break;
            } else {
                result = result && res[i][days-1];
            }
        }
        return result;
    }
}
http://paul198247.blogspot.com/2015/08/fb.html
  boolean canCatchTheft(int nint strategy[]) {
        int k = strategy.length;
        // nextDay[i] means theft can survive in spot i or not on this day
        boolean nextDay[] = new boolean[n]; 
        boolean canSurvivepreab;
        // init the first day
        Arrays.fill(nextDaytrue); nextDay[strategy[0]] = false;
        for (int i = 1; i < k; ++i) { 
            canSurvive = falsepre = false;
            for (int j = 0; j < n; ++j) { 
                a = j == 0 ? false : pre;
                b = j == n - 1 ? false : nextDay[j + 1];
                pre = nextDay[j]; // store current day for the next round
                nextDay[j] = ((a || b) && strategy[i] != j) ? true : false;
                if(nextDay[j] == truecanSurvive = true
            }
            if (!canSurvivereturn true;
        }
        return false;

    }
http://www.mitbbs.com/article_t/JobHunting/32978937.html
找小偷问题,有n个房间,其中一个房间有小偷。早上我们
可以打开一个房间的门看小偷在不在里面,晚上小偷会向左边或者右边的房间走。
现在给你一个开门的sequence,你输出这个sequence能不能保证找到小偷。
比如:如果只有三个房间那么如果打开房间的sequence是{1,1}那么一定会找到小偷。
因为如果小偷在中间那么第一天就会被找到,如果小偷在两边那么第二天一定回来
到中间也会被找到。房间数为n,sequence长度为k

跟着我开始brute force假设小偷在某个房间然后dfs所有路径,大概是O(n*n^k)。 
考官说好,如果考虑cut branch呢?跟着我就说可以拿一个n*k的matrix跟着根据
sequence来cut branch,reduce到O(n*n*k)。他说有没有可能同时从所有房间
开始呢?我说可以跟着直接在那个n*kmatrix上做一个类似dp的东西。跟着reduce 到 
O(n*k)。他说有没有可能把space reduce呢?我说可以我只要O(n)的space
跟着他就让我再写一个叫nextRow的function来实现O(n)space。 我觉得这题我
基本是答得非常漂亮的而且思路很清晰,考官也很开心

Read full article from LIKE CODING: MJ [27] Catch Thief

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