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;
}
}

最新文章

  1. [笔记]kubernetes 无法启动问题
  2. Synchronized同步性与可见性
  3. 自学C++第一天
  4. MonkeyRunner测试一MonkeyRunner的使用
  5. SSH服务器与Android通信(2)--Android客户端接收数据
  6. JQuery validate验证 自定义
  7. SpringJUnit4ClassRunner拉起来的单元测试怎么装配Container实例
  8. Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图
  9. Jsp详解
  10. Javascript中闭包的作用域链
  11. 读书时间《JavaScript高级程序设计》六:事件
  12. 【IOS开发】基础
  13. Android名片扫描识别系统SDK
  14. SIP DB33标准笔记 注册/目录发送/心跳
  15. css相关 细节 优化 备忘
  16. asp.net core 的 razor pages 如何使用ajax调用后台方法
  17. 【Spring】28、Spring中基于Java的配置@Configuration和@Bean用法.代替xml配置文件
  18. 使用HttpUtils完成Http Basic 认证
  19. 【Python61--异常处理】
  20. 使用Rancher的RKE快速部署Kubernetes集群

热门文章

  1. inux下tcpdump命令的使用
  2. (转)linux centos 编译luabind-0.9.1 动态库 静态库
  3. Python全栈开发:选课系统实例
  4. DOM节点的创建、插入、删除
  5. 中国剩余定理模数互质的情况模板(poj1006
  6. C++萃取技术的一个简单初探
  7. springboot在工具类中添加service的方法,显示为空的解决方案
  8. vue爬坑之input组件
  9. iOS开发UITableView的动画cell
  10. RedHat服务器搭建Jenkins