lc287 Game of Live
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的更多相关文章
随机推荐
- 18-2-call和apply
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- SpringBoot之集成通用Mapper
			第一种: 1.引入POM坐标,需要同时引入通用mapper和jpa <dependency> <groupId>tk.mybatis</groupId> <a ... 
- MapReduce工作流程
- 【笔记篇】C#笔记1
			返回目录:目录请戳这里~ 以后的C#笔记如果不出意外的话都是Win10 Professional + VS2015 Professional出的,(当然还有直接在编译框敲的所以能不能过编译我也不知道┑ ... 
- android中实现监听的四种方法
			(1)自身类作为事件监听器 package cn.edu.gdmec.s07150745.work5; import android.support.v7.app.AppCompatActivity; ... 
- Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器
			前言 在Android里获取视频的信息主要依靠MediaMetadataRetriever实现 获取最佳视频预览图 所谓的最佳就是MediaMetadataRetriever自己计算的 /** * 获 ... 
- LUOGU  P3382 【模板】三分法 (三分)
			传送门 解题思路 三分,填坑.每次取l与r的中间值mid,然后向左移一点点,向右移一点点进行判断,判断时用秦九韶算法即可. #include<iostream> #include<c ... 
- React报错:Laravel React-Router browserHistory 刷新子页面报错404
			举例:myblog.com/ 刷新没问题 myblog.com/add 刷新404 browserHistory报404,hashHistory却正常 原因是少路由.web.php添加路由 Route ... 
- Android基础控件TextView
			1.常用属性 <TextView android:id="@+id/text11" //组件id android:layout_width="match_paren ... 
- UltraISO刻录CentOS 7安装指南
			CentOS 7.2 安装指南(U盘版) 一.准备阶段 1.下载CentOS7镜像文件(ISO文件)到自己电脑,官网下载路径: http://isoredirect.centos.org/centos ... 
