标签:
原题链接在这里:https://leetcode.com/problems/game-of-life/
简单的想法就是copy 原来矩阵,然后根据copy 来修改原来的矩阵,如此做会使用O(m*n) space.
如何做到In-space呢,我们需要根据改动前的状态来数出live cell 的个数,已经更改的点如何知道原有的状态呢。就要多mark出几种conditions.
Dead->Dead: Condition 0; Live->Live : Condition 1; Live->Dead: Condition 2; Dead->Live:Condition 3
如此在数数的时候如果原道1 和 2他们原有的状态都是live,就都要算。
最后通过把所有的数%2来更改最后的状态。
Note: 通过countLive 数Live cell 时注意边界情况,同时注意x 和 y 那个是行那个是列。
如何定义这四种状态?第一个原因是通过如此顺序是因为0本身就是dead cell, 1本身就是live cell, 如此在countLive完成后可以尽量少改动数组,如果还是live的1的状态就不用动了;
第二个原因最后对0,1,2,3改回0,1时 可以直接通过%2改动省事。
如果需要记住原有状态就可以通过增加condition 来搞定。
AC Java:
1 public class Solution { 2 public void gameOfLife(int[][] board) { 3 if(board == null || board.length == 0 || board[0].length == 0){ 4 return; 5 } 6 int m = board.length; 7 int n = board[0].length; 8 //Mark four conditions 9 // Dead->Dead: 0; Live->Live : 1; Live->Dead: 2; Dead->Live:3 10 for(int i = 0; i<m; i++){ 11 for(int j = 0; j<n; j++){ 12 int c = countLive(board, i, j); 13 //If this cell is currently dead 14 if(board[i][j] == 0){ 15 if(c == 3){ 16 board[i][j] = 3; //dead->live 17 } 18 }else{//If this cell is currently alive 19 if(c < 2 || c > 3){ 20 board[i][j] = 2; //live->dead 21 } 22 } 23 } 24 } 25 26 //Seconde iteration, mark 2 to 0, mark 3 to 1. 27 for(int i = 0; i<m;i++){ 28 for(int j = 0; j<n; j++){ 29 if(board[i][j] %2 == 0){ 30 board[i][j] = 0; 31 }else{ 32 board[i][j] = 1; 33 } 34 } 35 } 36 } 37 38 //function calculating the number of live cells around the cell 39 private int countLive(int [][] board, int i, int j){ 40 int c = 0; 41 for(int x = i-1; x<=i+1; x++){ 42 for(int y = j-1; y<=j+1; y++){ 43 if(x<0 || y <0 || x>=board.length || y>=board[0].length || (x==i && y==j)){ 44 continue; 45 } 46 if(board[x][y] == 1 || board[x][y] == 2){ 47 c++; 48 } 49 } 50 } 51 return c; 52 } 53 }
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4868848.html