lc287 Game of Live

难点在于不能使用额外的空间。

观察到数组中每一个元素要么为1要么为0,32位int只用了一位,可以利用bit操作,将第二次state存储到int变量的倒数第二位中。例:board[i][j] = 3, 换成二进制就是一堆0最后两位是11,表达的含义就是当前状态cell为live,下一次状态还是live。

1) 如何更新第一次state 直接把board[i][j]右移一位即可,这样就把第一次state更新为第二次state

2) 如何更新第二次state 需要统计当前cell周围存活cell的数量,注意可能写code的时候边缘cell会导致数组越界,要添加判断条件Math.max(0, i-1), Math.max(0, j-1), Max.min(m, i+1), Math.max(n, j+1) 然后就可以按照规则更新第二次state,注意由于更新第一次state时使用的是右移操作,所以第二次state的默认值为0,就是说我们只需要处理第二次state为1的情况即可。

代码如下:

 class Solution {
public void gameOfLife(int[][] board) {
if(board == null || board.length == 0)
return; int m = board.length;
int n = board[0].length; for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
int lives = count(board, m, n, i, j); if(board[i][j] == 1 && lives >= 2 && lives <= 3)
board[i][j] = 3;
else if(board[i][j] == 0 && lives == 3)
board[i][j] = 2;
}
} for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
board[i][j] >>= 1;
}
}
} private int count(int[][] board, int m, int n, int i, int j){
int count = 0; for(int a = Math.max(0, i-1); a <= Math.min(m - 1, i+1); a++){
for(int b = Math.max(0, j-1); b <= Math.min(n-1, j+1); b++){
count += board[a][b] & 1;
}
} count -= board[i][j] & 1;
return count;
}
}

lc287 Game of Live的更多相关文章

随机推荐

  1. 牛客网NOIP赛前集训营-普及组(第七场)

    链接:C 来源:牛客网 牛牛的同学给牛牛表演了一个读心术:牛牛先任意选定一个非负整数,然后进行N次操作:每次操作前,假设牛牛当前的数是a,那么这个操作可能是a = a + x, 或者a = a * x ...

  2. 批量处理数据 SqlBulkCopy

    string connectionString = new PublicDBHelper().GetCon(System.Configuration.ConfigurationManager.AppS ...

  3. opencv编译:opencv 3.4.1 编译 contrib模块,增加人脸识别

    start cmake-gui select the opencv source code folder and the folder where binaries will be built (th ...

  4. bzoj1010: [HNOI2008]玩具装箱toy——斜率优化

    方程 $\Large f(i)=min(f(j)+(s(i)-s(j)-1-L)^2)$ 其中$s(i)$为i的前缀和再加上$i$ 对于某个$i$若$j$比$k$优,则 $\large f(j)+(s ...

  5. 使用log4j实现日志API

    添加SLF4J依赖,用于提供日志API, 使用log4j作为实现 1.pom.xml添加SLF4J依赖 <!-- SLF4J --> <dependency> <grou ...

  6. JSM 基础

    JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信 ...

  7. 日志服务与SIEM(如Splunk)集成方案实战

    背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规.审计.与其他相关日志能够导入到您的安全运维中心(SOC)中. 名词解释 LOG( ...

  8. python中的多线程编程与暂停、播放音频的结合

    先给两个原文链接: https://blog.csdn.net/u013755307/article/details/19913655 https://www.cnblogs.com/scolia/p ...

  9. 关于MQ 消息队列的通俗理解和 rabbitMQ 使用

    消息队列,一听很高大上,现在很多分布式系统都在用这个消息中间件 网上一搜, 说的都是些原理. 说下我的通俗理解, 你网上买了, 快递员给你投递, 会出现什么问题呢? 1  你不定时在家, 快递员 来了 ...

  10. java浮点运算的陷阱

    首先呢,i你要明白double和float. Inifinity: 例如:syso(5.0/0.0+" 和"+0.0 /0.0); 浮点运算的0.0不是真正意义上的0,而是非常接近 ...