LintCode 394 - Coins in a Line


(394) Coins in a Line
There are n coins in a line. Two players take turns to take one or two coins from right side until there are no more coins left. The player who take the last coin wins.
Could you please decide the first play will win or lose?
Example
n = 1, return true.
n = 2, return true.
n = 3, return false.
n = 4, return true.
n = 5, return true.Follow Up Question:
If n is even. Is there any hacky algorithm that can decide whether first player will win or lose in O(1) memory and O(n) time?

This is similar to Coins in a Line II. The only difference is that it's in a 2-d scope.
https://coding-interview-solutions.hackingnote.com/problems/coins-in-a-line.html
    public boolean firstWillWin(int n) {
        if (n % 3 == 0) return false;
        return true;
    }
https://helloyuantechblog.wordpress.com/2016/01/07/lintcode-394-coins-in-a-line-medium/
Finding patterns. When there is 1 or 2 coins, the first player will always win. When there are 3, the second player will always win. When there are 4 or 5, the first play can first take 1 or 2 to make the rest 3, so that the second player will lose. When there are 6, the second player can always transform it to 3, so that he always win. So to generalize, if the coins do not have a factor of 3, the first player will always win.
A more systematic analysis is a top down approach for searching: given n coins, the first play can take either 1 or two, leaving the second player with n-1 or n-2 coins. Then the second player can take 1 or 2, leaving the first player again n-2, n-3 coins (when first player take 1 coin in the first round) or n-3, n-4 coins (when he takes 2). So we can define the problem as given n coins, and the first player is now choosing, whether he can win in the end or not. For him to win, he could either choose 1 or 2, so it is a OR between two situations; no matter what second player chooses, the first player should win, so it is a AND in the secondary level.
Screen Shot 2016-01-07 at 11.45.29 PM
The relationship is:
f[n] = (f[n-2] && f[n-3]) || (f[n-3] && f[n-4])
We need to initialize f[0], f[1], f[2] f[3]. The result is then f[n]. This could be optimized using O(1) space.

     bool firstWillWin(int n) {
        // write your code here
        if (n <= 4) {
            return n == 3 || n == 0 ? false : true;
        }
        vector<bool> f(n+1, false);
        f[1] = f[2] = true;
        f[3] = false;
        for(int i = 4; i <= n; i++) {
            f[i] = (f[i-2] && f[i-3]) || (f[i-3] && f[i-4]);
        }
        return f[n];
    }

Space optimization
     bool firstWillWin(int n) {
        // write your code here
        if (n <= 4) {
            return n == 3 || n == 0 ? false : true;
        }
        vector<bool> f(5, false);
        f[1] = f[2] = true;
        f[3] = false;
        for(int i = 4; i <= n; i++) {
            f[i%5] = (f[(i-2)%5] && f[(i-3)%5]) || (f[(i-3)%5] && f[(i-4)%5]);
        }
        return f[n%5];
    }
https://github.com/shawnfan/LintCode/blob/master/Java/Coins%20in%20a%20Line.java
Clarify: '1st play will win' means: if play properly,
1st play will surely have a way to win that 2nd play can't beat.
Make dp[i]: the result when n = i.
fn:
Think back a step, state-1:
When it's play1's turn, there might be 1 or 2 coins left so he can win. so -1, or -2.
THink back a 2nd step, state-2:
Play2 take 1 or 2 to get into state-1. play2 may take 1 or 2 coins. so again, -1 or -2.
So consider i-1, i-2, i-3, or i-4. Note, the next stemp would be for play2, then play1.
However, if left are 1,2 coins for play2, play2 wins; if left are 4 coins, play2 wins; only when left are 3 coins, play2 will surely lose, so play1 win.
Therefore, there is just 1 case to consider: if left are 3 coins, and it's play2's turn, then play1 surely wins.
so fn:
dp[i] = dp[i-3]
Init:
dp[0] = false; dp[1], dp[2] = tru; dp[3] = false;
Result:
dp[n]

public boolean firstWillWin(int n) {
    if (n <= 0) {
        return false;
    }
  if (n <= 2) {
    return true;
  }
  boolean[] dp = new boolean[n + 1];
  dp[1] = true;
  dp[2] = true;
  dp[3] = false;
  for (int i = 4; i <= n; i++) {
    dp[i] =  dp[i - 3];
  }
  return dp[n];
}

http://www.jiuzhang.com/solutions/coins-in-a-line/

    public boolean firstWillWin(int n) {
        // write your code here
        boolean []dp = new boolean[n+1];
        boolean []flag = new boolean[n+1];
        return MemorySearch(n, dp, flag);
    }
    boolean MemorySearch(int i, boolean []dp, boolean []flag) {
        if(flag[i] == true) {
            return dp[i];
        }
        if(i == 0) {
            dp[i] = false;
        } else if(i == 1) {
            dp[i] = true;
        } else if(i == 2) {
            dp[i] = true;
        } else {
            dp[i] = !MemorySearch(i-1, dp, flag) || !MemorySearch(i-2, dp, flag);
        }
        flag[i] =true;
        return dp[i];
    }
}
    /**
     * @param n: an integer
     * @return: a boolean which equals to true if the first player will win
     */
    public boolean firstWillWin(int n) {
        // write your code here
        int []dp = new int[n+1];
        
        return MemorySearch(n, dp);
        
    }
    boolean MemorySearch(int n, int []dp) { // 0 is empty, 1 is false, 2 is true
        if(dp[n] != 0) {
            if(dp[n] == 1)
                return false;
            else
                return true;
        }
        if(n <= 0) {
            dp[n] = 1;
        } else if(n == 1) {
            dp[n] = 2;
        } else if(n == 2) {
            dp[n] = 2;
        } else if(n == 3) {
            dp[n] = 1;
        } else {
            if((MemorySearch(n-2, dp) && MemorySearch(n-3, dp)) || 
                (MemorySearch(n-3, dp) && MemorySearch(n-4, dp) )) {
                dp[n] = 2;
            } else {
                dp[n] = 1;
            }
        }
        if(dp[n] == 2) 
            return true;
        return false;
    }

Recursive: Complexity is power(2,n). 

  1. int firstWillWin(vector<int> &values, int s, int e) {  
  2.     if(s == e) return values[s];  
  3.     return max( values[s] - firstWillWin(values, s+1, e),  
  4.                values[e] - firstWillWin(values, s, e-1) );  
  5.       
  6. }  
  7. bool firstWillWin(vector<int> &values) {  
  8.     int len = values.size();  
  9.     if(len<=2) return true;  
  10.     return firstWillWin(values, 0, len-1) > 0;  
  11. }  
DP:
http://www.danielbit.com/blog/puzzle/leetcode/leetcode-coins-in-a-line
http://www.jiuzhang.com/solutions/coins-in-a-line/

  1. bool firstWillWin(vector<int> &values) {  
  2.     int len = values.size();  
  3.     if(len<=2) return true;  
  4.     vector<vector<int>> f(len, vector<int>(len,0));          
  5.     for(int i=0;i<len;i++) f[i][i] = values[i];  
  6.     for(int i=len-2;i>=0;i--)  
  7.     {  
  8.         for(int j=i+1;j<len;j++)  
  9.         {  
  10.             f[i][j] = max(values[i] - f[i+1][j], values[j] - f[i][j-1]);  
  11.         }  
  12.     }  
  13.     return f[0][len-1] > 0;  
  14. }  

第三题,是可以从两端取一个,需要把一维数组变成二维,而且注意边界情况0 w&
  1.     public boolean firstWillWin(int[] A) {
  2.         // write your code here7 n; N* a5 L) o% m; f5 [) R
  3.         if(A.length <= 2)   return true;
  4.         int[][] D = new int[A.length+10][A.length+10];+ Z2 x3 X# ~$ M( X+ o
  5.         for(int i=0; i<D.length; i++) {7 z' M0 q6 {7 A1 T# O1 S9 l. S" h, e6 S
  6.             for(int j=0; j<D[0].length; j++) {8 n% B, D  w0 Y+ X1 A
  7.                 D【i】[j] = Integer.MAX_VALUE/2;$ W6 a! W1 b+ f; U$ j5 I
  8.             }6 q9 A9 P2 h2 f
  9.         }6 ~) W6 g" k3 a- ~( ?! c
  10.         for(int i=1; i<=A.length; i++) {5 F3 j8 P- Q4 Z/ N% s1 ~: ^9 }
  11.             D【i】【i】 = A[i-1];1 |& O: E3 X2 d. d# ~  p8 B
  12.         }
  13.         int sum = 0;
  14.         for(int i=A.length; i>=1; i--) {9 L+ L0 o, O( h# s+ @) ?" O
  15.             sum += A[i-1];
  16.             for(int j=i+1; j<=A.length; j++) {. Y3 Z3 t/ I6 j. r2 ?
  17.                 D【i】[j] = Math.max(A[i-1] + Math.min(D[i+2][j], D[i+1][j-1]),
  18.                     A[j-1] + Math.min(D[i+1][j-1], D【i】[j-2]));
  19.             }
  20.         }; D3 W3 H( t& I& S& _6 l: x, w

  21.         return D[1][A.length] > sum - D[1][A.length];+ V1 B. @$ V% U
  22.     }
https://codesolutiony.wordpress.com/2015/05/24/lintcode-coins-in-a-line/
    public boolean firstWillWin(int n) {
        return n % 3 != 0;
    }

Read full article from (394) Coins in a Line

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