leetcode 289. 生命游戏【数组】

比较简单的题目,最简单的做法就是拷贝一个board数组,然后用新的数组用来比较,在旧数组上改动。
但题目要求原地改动,因此需要在原数组中记录两次的信息。
可以有两种方法:

  1. 使用二进制数来记录信息,第1位记录上次信息,第二位记录本次信息,计算结束后把数据右移一位,清空上次信息即可;
  2. 使用数字的符号记录,活细胞变死,赋值2,死细胞复活,赋值-1,这样只要判断大于0,则原来为活细胞,小于0,则原来为死细胞,计算结束后再适当处理即可。
class Solution {
    public void gameOfLife(int[][] board) {
        int m = board.length;
        int n = board[0].length;   
        int[][] dir = {{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};
        for(int i=0; i<m; i++){
            for(int j=0; j<n;j++){
                int cur = board[i][j];
                int count=0;
                for(int k=0;k<dir.length;k++){
                    int x = i+dir[k][0];
                    int y = j+dir[k][1];
                    if(x>=0 && x<m && y>=0 && y<n && (board[x][y]&1)== 1){
                        count++;
                    }       
                }
                if(cur==1){
                    if(count<2||count>3){
                        board[i][j] = 1;//01
                    }else{
                        board[i][j] = 3;//11
                    }
                }
                if(cur==0){
                    if(count==3){
                        board[i][j] = 2;//10
                    }
                }
            }
        }
        for(int i=0; i<m; i++){
            for(int j=0; j<n;j++){
                board[i][j] = board[i][j]>>1;
            }
        }
        
    }
}
发布了55 篇原创文章 · 获赞 0 · 访问量 764

猜你喜欢

转载自blog.csdn.net/er_ving/article/details/105268507