【问题描述】

根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。示例:输入:
[[0,1,0],[0,0,1],[1,1,1],[0,0,0]
]
输出:
[[0,0,0],[1,0,1],[0,1,1],[0,1,0]
]

【解答思路】

1. 时间复杂度:O(N) 空间复杂度:O(N)

@leedcodeJerry

class Solution {int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};int[][] board;int m, n;public void gameOfLife(int[][] board) {if (board == null || board.length == 0 || board[0] == null || board[0].length == 0) return;this.m = board.length;this.n = board[0].length;// 遍历for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 拿到当前位置周围活细胞数量int cnt = countAlive(i, j);// 1. 活细胞周围八个位置有两个或三个活细胞,下一轮继续活if (board[i][j] == 1 && (cnt == 2 || cnt == 3)) board[i][j] = 3;// 2. 细胞本来死的,周围有三个活着的,下一轮复活了if (board[i][j] == 0 && cnt == 3) board[i][j] = 2;}}// 更新结果for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 右移 1 就是除以 2board[i][j] >>= 1;}}}private int countAlive(int x, int y) {int cnt = 0;for (int k = 0; k < 8; k++) {int nx = x + dx[k];int ny = y + dy[k];if (nx < 0 || nx >= m || ny < 0 || ny >= n) continue;// 如果这个位置为 0,代表是死的,之前死或者之后死都不会算进去// 如果这个位置为 1,代表是是活得,并且是还没遍历到,需要算进去// 如果这个位置为 2,代表是是活得,修改过了,并且之前是死的,不需要算进去// 如果这个位置为 3,代表是是活得,修改过了,并且之前是活的,需要算进去cnt += (board[nx][ny] & 1);}return cnt;}
}

#### 【总结】
**1.方向技巧**

int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};
int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};

**2.this 关键字用法**
[[Java]中[this][super]用法总结](https://blog.csdn.net/dadongwudi/article/details/105264127)this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针。
2.1 普通的直接引用
2.2 形参与成员名字重名,用 this 来区分

class Person {
private int age = 10;
public Person(){
System.out.println(“初始化年龄:”+age);
}
public int GetAge(int age){
this.age = age;
return this.age;
}
}

public class test1 {
public static void main(String[] args) {
Person Harry = new Person();
System.out.println("Harry’s age is "+Harry.GetAge(12));
}
}

运行结果:

初始化年龄:10
Harry’s age is 12

可以看到,这里age是GetAge成员方法的形参,this.age是Person类的成员变量。

2.3 引用构造函数
this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。**3.手撕代码 例子模拟一遍对于题目的理解很重要**

[Leedcode][JAVA][第289题][生命游戏]相关推荐

  1. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  2. [Leetcode] 第289题 生命游戏

    一.题目描述 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初 ...

  3. [Leedcode][JAVA][第55题][跳跃游戏][贪心][动态规划]

    [问题描述] 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置.示例 1:输入: [2,3,1,1,4] 输出: tr ...

  4. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  5. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  6. 蓝桥杯------2017 Java B组 国赛:第二题 生命游戏

    题目描述: 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.   这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的状态 ...

  7. 使用JAVA GUI实现细胞生命游戏

    问题描述:生命游戏是英国数学家约翰·何顿·康威在年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的 ...

  8. Leetcode 289:生命游戏(最详细的解法!!!)

    根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初始状态 liv ...

  9. [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]

    [问题描述][中等] 给定一个无序的整数数组,找到其中最长上升子序列的长度.示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它 ...

最新文章

  1. Android Studio安卓开发中使用json来作为网络数据传输格式
  2. 一次字节面试,被二叉树的层序遍历捏爆了
  3. Android蓝牙4.0的数据通讯
  4. BZOJ-2535 航空管制 toposort
  5. Increasing Frequency(CF-1082E)
  6. ajax上传变量,通过ajax传递post变量
  7. FileItem 出现部分中文乱码解决办法
  8. 软件测试基础:自动化测试、安全测试、性能测试
  9. 【语音编码】基于matlab LPC编解码【含Matlab源码 554期】
  10. 联想E460关闭触摸板
  11. 英语单词速记(一直更新中......)
  12. python简单聊天工具开发
  13. 校园网服务器系统方案设计,校园网服务器系统项目设计方案.pdf
  14. http协议学习(转载,侵删)
  15. 怎么压缩图片大小?建议收藏这些方法
  16. Hui-iconfont字符图标不显示或显示异常。
  17. 怎么学习CAD?初学CAD如何入门
  18. 【unity】Google 登录和Google支付接入unity
  19. 原子操作Atomic类
  20. 中兴笔试题目总结(一)C++部分

热门文章

  1. Examining Open vSwitch Traffic Patterns
  2. 如何给APK文件签名
  3. Mplayer 音频解码分析
  4. 统一管理MOSS2010用户头像
  5. 网页设计师的最佳设计工具名单出炉
  6. 地壳中元素含量排名记忆口诀_广州地化所等发现洋内弧大陆地壳成熟新机制
  7. Redis分布式锁—SETNX+Lua脚本实现篇
  8. 博客园文章方块背景格式
  9. Springboot整合ActiveMQ发送邮件
  10. Android百度云推送接入,附完整代码