题目链接
法一(位运算 + 原地算法)
private static final int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1};
private static final int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};
public void gameOfLife(int[][] board) {
if (board.length == 0) {
return;
}
int rowSize = board.length;
int colSize = board[0].length;
for (int row = 0; row < rowSize; row++) {
for (int col = 0; col < colSize; col++) {
int cnt = 0;
for (int k = 0; k < 8; k++) {
int x = row + dx[k];
int y = col + dy[k];
if (x < 0 || x >= rowSize || y < 0 || y >= colSize) {
continue;
}
cnt += board[x][y] & 1;
}
if (cnt == 3 || (cnt == 2 && (board[row][col] & 1) == 1)) {
board[row][col] |= 0b10;
}
}
}
for (int row = 0; row < rowSize; row++) {
for (int col = 0; col < colSize; col++) {
board[row][col] >>= 1;
}
}
}
本地测试
lay.showTitle(289);
Solution289 sol289 = new Solution289();
int[][] board289 = new int[][]{{0, 1, 0}, {0, 0, 1}, {1, 1, 1}, {0, 0, 0}};
arrayOpt.showIntTwoDimArray(board289, board289.length);
sol289.gameOfLife(board289);
arrayOpt.showIntTwoDimArray(board289, board289.length);