最后更新
二刷
15-Jan-2017
用右起第二位来表示更新结果,这样最右位依然可以用来判断。
最后再遍历一次全部更新就行了。
做得好傻逼,应该可以用1 0 -1 0 1这样滚动来做。
Time: O(MN)
Space: O(1)
public class Solution {
public void gameOfLife(int[][] board) {
// <2 dead
// 2/3 live
// > 3 dead
// dead with 3 => live
if (board.length == 0) return;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
check(i, j, board);
}
}
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if ((board[i][j] & (1<<1)) != 0) {
board[i][j] = 1;
} else {
board[i][j] = 0;
}
}
}
return;
}
public void check(int i, int j, int[][] board) {
int live = 0;
if (i > 0 && (board[i-1][j] & 1) == 1) live++;
if (j > 0 && (board[i][j-1] & 1) == 1) live++;
if (i < board.length-1 && (board[i+1][j] & 1) == 1) live++;
if (j < board[0].length-1 && (board[i][j+1] & 1) == 1) live++;
if (i > 0 && j > 0 && (board[i-1][j-1]&1) == 1) live++;
if (i < board.length-1 && j < board[0].length-1 && (board[i+1][j+1]&1) == 1) live++;
if (i > 0 && j < board[0].length-1 && (board[i-1][j+1]&1) == 1) live++;
if (i < board.length-1 && j > 0 && (board[i+1][j-1]&1) == 1) live++;
if(board[i][j] == 1 && live < 2) board[i][j] |= (0<<1);
else if(board[i][j] == 1 && (live == 2 || live == 3)) board[i][j] |= (1<<1);
else if(board[i][j] == 0 && live == 3) board[i][j] |= (1<<1);
else board[i][j] |= (0<<1);
}
}
一刷
02-Sep-2016
根据邻居的情况决定自己下回合啥屌样。
要求一次性更新,不能说第一排更新完了用更新的结果去更新第二排。
所以要重新弄个期盼记录下回合啥样,最后一起更新。
然后要求in-place,不能用第二个棋盘了。
因为0是死,1是活,1 bit就能表示,所以不妨用另一个bit表示结果,判断只用第一个bit判断。
最后重新遍历期盼,根据另一个bit改写最后生死状况。
做起来方法很多,但是思路大致就这样了。
public class Solution {
public void gameOfLife(int[][] board) {
for(int i = 0; i < board.length;i++)
{
for(int j = 0; j < board[0].length;j++)
{
change(board,i,j);
}
}
for(int i = 0; i < board.length;i++)
for(int j = 0; j < board[0].length;j++)
{
if((board[i][j] & (1<<1)) != 0) board[i][j] = 1;
else board[i][j] = 0;
}
}
public void change(int[][] board,int m,int n)
{
int count = 0;
if(m>0 && n >0 && ((board[m-1][n-1] & 1)==1)) count++;
if(m>0 && ((board[m-1][n] & 1)==1)) count++;
if(m>0 && n<board[0].length-1 && ((board[m-1][n+1] & 1) == 1)) count++;
if(n < board[0].length-1 && ((board[m][n+1] & 1) == 1)) count++;
if(m<board.length-1 && n<board[0].length-1 && ((board[m+1][n+1] & 1)==1)) count++;
if(m<board.length-1 && ((board[m+1][n] & 1) == 1)) count++;
if(m<board.length-1 && n > 0 && ((board[m+1][n-1] & 1) == 1)) count++;
if(n>0 && ((board[m][n-1] & 1) == 1)) count++;
if(board[m][n] == 1 && count < 2) board[m][n] |= (0<<1);
else if(board[m][n] == 1 && (count == 2 || count == 3)) board[m][n] |= (1<<1);
else if(board[m][n] == 0 && count == 3) board[m][n] |= (1<<1);
else board[m][n] |= (0<<1);
}
}
眼写花了。。