[LeetCode] 289. Game of Life

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 289. Game of Life相关的知识,希望对你有一定的参考价值。

生命游戏。题意是给一个board,上面所有的元素表示细胞,细胞的死或活用0或1表示。并且有如下规则,对于每个细胞周围的八个细胞,

1. 如果小于两个活细胞,则当前细胞死亡;

2. 如果有两个或者三个活细胞,则当前细胞存活;

3. 如果大于三个活细胞,则当前细胞死亡;

4. 如果当前细胞死亡但是周围有三个活细胞,则当前细胞可以复活;

根据如上规则请更新这个board的存活情况。要求是in-place做。

 

思路没有什么特别的,但是这个题又是数组但是要求不使用额外空间。不用额外空间的题目还有73题。这个题因为要求是in-place做所以在不能创造额外空间的情况下,只能通过一个叫做状态机的东西来记录每个cell的状态改变。这里我再次引用grandyang大神的解释

状态0: 死细胞转为死细胞

状态1: 活细胞转为活细胞

状态2: 活细胞转为死细胞

状态3: 死细胞转为活细胞

最后对所有状态对2取余,则状态0和2就变成死细胞,状态1和3就是活细胞,达成目的。先对原数组进行逐个扫描,对于每一个位置,扫描其周围八个位置,如果遇到状态1或2,就计数器累加1,扫完8个邻居,如果少于两个活细胞或者大于三个活细胞,而且当前位置是活细胞的话,标记状态2,如果正好有三个活细胞且当前是死细胞的话,标记状态3。完成一遍扫描后再对数据扫描一遍,对2取余变成我们想要的结果。

按照这个思路就可以写代码了。需要遍历input两次,第一次需要遍历input的每一个cell,先算出每个cell周围的八个cell有几个是活的,以得出当前cell的存活情况。如果当前cell经计算可以存活,标记成2;如果不能存活,标记成3。第二次遍历的时候对2取余变成我们想要的结果。

时间O(mn)

空间O(1)

 1 /**
 2  * @param {number[][]} board
 3  * @return {void} Do not return anything, modify board in-place instead.
 4  */
 5 var gameOfLife = function (board) {
 6     for (let i = 0; i < board.length; i++) {
 7         for (let j = 0; j < board[0].length; j++) {
 8             let liveCells = count(board, i, j);
 9             if (board[i][j] === 1 && (liveCells < 2 || liveCells > 3)) {
10                 board[i][j] = 2;
11             }
12             if (board[i][j] === 0 && liveCells === 3) {
13                 board[i][j] = 3;
14             }
15         }
16     }
17 
18     for (let i = 0; i < board.length; i++) {
19         for (let j = 0; j < board[0].length; j++) {
20             board[i][j] %= 2;
21         }
22     }
23 };
24 
25 let count = function (board, i, j) {
26     let count = 0;
27     let indexes = [[1, -1], [1, 0], [1, 1], [0, -1], [0, 1], [-1, -1], [-1, 0], [-1, 1]];
28     for (let index of indexes) {
29         if (index[0] + i < 0 || index[0] + i > board.length - 1 || index[1] + j < 0 || index[1] + j > board[0].length - 1) continue;
30         if (board[index[0] + i][index[1] + j] === 1 ||
31             board[index[0] + i][index[1] + j] === 2) count++;
32     }
33     return count;
34 };

 

以上是关于[LeetCode] 289. Game of Life的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 289. Game of Life

Leetcode 289. Game of Life

289. Game of Life

289. Game of Life

289. Game of Life

289. Game of Life