码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Game of Life

时间:2015-10-11 11:28:09      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:

原题链接在这里: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 }

 

LeetCode Game of Life

标签:

原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4868848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!