LeetCode题练习与总结:生命游戏--289

一、题目描述

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

  1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
  2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
  3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
  4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

示例 1:

输入:board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]
输出:[[0,0,0],[1,0,1],[0,1,1],[0,1,0]]

示例 2:

输入:board = [[1,1],[1,0]]
输出:[[1,1],[1,1]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 25
  • board[i][j] 为 0 或 1

二、解题思路

  1. 遍历面板上的每个细胞,计算每个细胞周围八个位置的活细胞数量。
  2. 根据上述四条生存定律,确定每个细胞下一状态是活细胞还是死细胞。
  3. 由于细胞的出生和死亡是同时发生的,我们不能直接在原数组上修改细胞状态,否则会影响后续细胞的判断。因此,我们可以使用一个额外的状态,比如用2表示一个活细胞将死亡,用-1表示一个死细胞将复活。
  4. 在完成对所有细胞的判断后,再次遍历面板,将状态2转换为0,将状态-1转换为1。

三、具体代码

class Solution {public void gameOfLife(int[][] board) {int m = board.length;int n = board[0].length;// 定义方向数组,用于计算八个相邻位置int[][] dirs = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 计算每个细胞周围八个位置的活细胞数量int liveNeighbors = 0;for (int[] dir : dirs) {int newRow = i + dir[0];int newCol = j + dir[1];if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n && (board[newRow][newCol] == 1 || board[newRow][newCol] == 2)) {liveNeighbors++;}}// 根据生存定律判断细胞下一状态if (board[i][j] == 1 && (liveNeighbors < 2 || liveNeighbors > 3)) {board[i][j] = 2; // 活细胞将死亡}if (board[i][j] == 0 && liveNeighbors == 3) {board[i][j] = -1; // 死细胞将复活}}}// 更新面板状态for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (board[i][j] == 2) {board[i][j] = 0;} else if (board[i][j] == -1) {board[i][j] = 1;}}}}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历面板:代码中有两个嵌套的for循环,分别用于遍历面板的行和列。这两个循环分别运行了m次和n次,其中m是面板的行数,n是面板的列数。

  • 计算活细胞数量:在第一个嵌套循环内部,还有一个对dirs数组的循环,这个数组的大小是固定的,为8。因此,对于面板上的每个细胞,我们都会执行8次操作来计算周围活细胞的数量。

由于面板上的每个细胞都需要执行固定次数的操作(8次),因此时间复杂度是O(m * n * 8)。由于常数因子在时间复杂度分析中通常被忽略,所以最终的时间复杂度是O(m * n)。

2. 空间复杂度
  • 方向数组dirs:这是一个大小为8的二维数组,它的大小是固定的,不随输入面板的大小而变化,因此它对空间复杂度的影响是常数级别的。

  • 输入面板board:我们没有使用额外的空间来存储面板的状态,而是直接在原数组上修改。虽然在计算过程中使用了额外的状态(2和-1),但这些状态是在原有数组元素上进行的,没有增加额外的空间。

因此,除了输入面板本身占用的空间外,我们只使用了常数级别的额外空间,所以空间复杂度是O(1)。这里假设修改输入面板的状态不计入额外空间的开销,如果修改输入面板的状态被视为使用额外空间,那么空间复杂度将是O(m * n)。但在大多数情况下,按照常规定义,我们不将输入数据本身的空间计入空间复杂度。

五、总结知识点

  1. 二维数组遍历:代码中使用了两个嵌套的for循环来遍历一个二维数组(面板),这是处理二维数据结构的基本技巧。

  2. 方向数组:使用了一个二维数组dirs来表示八个可能的移动方向,这是在处理网格问题时常用的方法,用于简化遍历相邻元素的过程。

  3. 边界检查:在访问二维数组的相邻元素时,代码中使用了边界检查来确保不会越界,这是编写健壮代码的重要部分。

  4. 状态转换:代码中使用了临时状态(2和-1)来表示细胞状态的转换,这是在原地算法(in-place algorithm)中常用的技巧,以避免使用额外的空间。

  5. 逻辑判断:根据生命游戏的规则,代码中包含了逻辑判断来确定细胞是生存还是死亡,这涉及到基本的条件语句(if-else)。

  6. 原地修改:在更新面板状态时,代码直接在原数组上修改了细胞的状态,这是原地算法的一个例子,可以减少空间复杂度。

  7. 数组元素访问:代码中频繁地通过索引访问数组元素,这是处理数组时的基本操作。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442815.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML图形

HTML图形 1. HTML5 Canvas2.HTML5 内联 SVG3.HTML 5 Canvas vs. SVG 1. HTML5 Canvas HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域&#xff0c;您可以控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 1、创建…

想要成为独立游戏作者 :通关!游戏设计之道 1-1

1-1代表该书《通关&#xff01;游戏设计之道》第一章的第一篇文章 游戏是什么&#xff1f; 小时候我是先有卡带游戏机后接触的平板电脑和手机&#xff0c;起初我认为游戏是带给人快乐的&#xff0c;我就喜欢游戏里面各种有趣的玩法&#xff0c;各种友爱的画风&#xff0c;尤其…

哈夫曼编码

文章目录 &#x1f34a;自我介绍&#x1f34a;哈夫曼编解码&#x1f34a;哈夫曼树介绍&#x1f34a;哈夫曼编码思想 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家…

AI 正在颠覆编程,程序员的出路在哪里?

AI 正在颠覆编程&#xff0c;程序员的出路在哪里&#xff1f; AI 的飞速发展&#xff0c;让程序员群体感受到了前所未有的压力。我们的工作&#xff0c;真的会被 AI 取代吗&#xff1f;未来的职业发展方向究竟在哪&#xff1f;我们应该害怕&#xff0c;还是应该拥抱这种变化&a…

Spring Boot ⽇志

目录 1.⽇志使⽤ 2.⽇志级别 3.⽇志配置 3.1配置⽇志级别 3.2⽇志持久化 3.3配置⽇志⽂件分割 4.更简单的⽇志输出 1.⽇志使⽤ 在使用之前我们先来了解一下为什么要使用&#xff1f; ⽇志的⽤途 1.系统监控 我们可以通过⽇志记录这个系统的运⾏状态&#xff0c;对数…

The legacy JS API is deprecated and will be removed in Dart Sass 2.0

The legacy JS API is deprecated and will be removed in Dart Sass 2.0 更新了sass版本后&#xff0c;启动项目控制台一直在报错&#xff0c;影响开发效率&#xff0c;强迫症表示忍受不了。 字面意思是&#xff1a;Sass在2.0版本将会移除legacy JS API&#xff0c;所以现在使…

Git的安装配置

目录 一、git和svn的区别是什么 二、下载Git 三、安装 四、使用 一、git和svn的区别是什么 1、git是分布式的&#xff0c;svn是集中的式的 2、git存储数据时是按元数据的方式存储&#xff0c;而svn是按文件的方式存储 3、git分支和svn的分支不一样 4、git没有全局版本号…

【Sceneform-EQR】(手势控制器实现)通过手势事件实现在AR/VR等三维场景中的控制模型旋转、平移与缩放

在Sceneform-EQR中实现旋转平移缩放手势 实现在AR/VR等三维场景&#xff0c;通过手势控制模型节点的缩放、平移和旋转。 实现思路 实现模型旋转 Sceneform-EQR(filament\opengl)中采用右手坐标系。通过欧拉角进行旋转采用Z->Y->X的顺序&#xff0c;在这里&#xff0c;…

iOS swift5 苹果app审核被拒 1.4.1

文章目录 1.被拒2. 官网1.4.1的规定3.如何解决参考博客 1.被拒 准则1.4.1-安全-人身伤害 该应用程序连接到外部医疗硬件&#xff0c;以提供医疗服务。然而&#xff0c;为了遵守准则1.4.1&#xff0c;您必须&#xff1a; -提供来自适当监管机构的文件&#xff0c;证明应用程序…

vim 操作

vim编辑器的有三种工作模式&#xff1a;命令模式、插入模式和底行命令模式 打开进入命令模式&#xff1a; 由命令模式到输入模式&#xff1a;i:在光标前插&#xff1b;a:在光标后插&#xff1b;o:在下一行插 由输入模式进入命令模式&#xff1a;esc 由命令模式进入底行命令…

LabVIEW激光诱导击穿光谱识别与分析系统

LabVIEW激光诱导击穿光谱&#xff08;LIBS&#xff09;分析系统利用高能量脉冲激光产生高温等离子体&#xff0c;通过分析等离子体发出的光谱来定性分析样品中的元素种类。该系统的开发集成了软件与硬件的设计&#xff0c;实现了自动识别和定性分析功能&#xff0c;适用于环境监…

多表数据实时同步和批量实时同步怎么高效实现?

对于企业来说&#xff0c;准确、及时的数据是进行数据分析和决策支持的基础。如果各个系统中的数据不能及时同步&#xff0c;就会影响数据分析的结果和决策的准确性。通过数据同步&#xff0c;可以将企业内部各个系统中的数据整合到一个数据仓库或数据分析平台中&#xff0c;为…

WSL(Windows Subsystem for Linux)——简单的双系统开发

文章目录 WSLWSL的作用WSL的使用WSL的安装挂载磁盘的作用安装linux发行版 WSL 前言&#xff1a;本人由于在开发中需要linux环境&#xff0c;同时还想要直接在Windows下开发&#xff0c;来提升开发效率&#xff0c;随即简单学习WSL。 WSL&#xff08;Windows Subsystem for Li…

水污染急需机器人,材料局限遇难题,MXene 水凝胶有潜力

大家好&#xff01;今天我们来了解一项关于水污染管理的前沿研究——《A MXene Hydrogel‐Based Versatile Microrobot for Controllable Water Pollution Management》发表于《Advanced Science》。水污染&#xff0c;尤其是有机染料污染&#xff0c;严重威胁着我们的健康和环…

【Linux基础】03 Linux环境基础开发工具使用

1. yum ——软件包管理器 yum 是我们 Linux 预装的一个指令&#xff0c;搜索、下载、、安装对应的软件 yum 相当于 Linux 的应用商店&#xff01; 安装与卸载 yum list | grep command 通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我…

大数据毕业设计选题推荐-电影票房数据分析系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

【CKA】CKA第二次考试经验总结

第一次考试申诉回来后&#xff0c;就重新预约了考试。 这一次考试&#xff0c;认真吸取了第一次的经验教训&#xff0c;认真对待&#xff0c;再不敢马虎大意了&#xff0c;哈哈。 一、考试前 以下准备做了好几次&#xff1a; 1、考试环境&#xff1a;重新找了有插网线的会议室…

微软官网列出了 Windows 11 LTSC 2024 中的全部新功能

今天早些时候&#xff0c;微软发布了有关受托管PC的Windows 11 24H2 升级和兼容性的详细信息。 该帖子针对的是负责在各自办公室和组织中处理系统的 IT 系统管理员。与此同时&#xff0c;微软也发布了有关 Windows 11 LTSC 或长期服务渠道的信息。 该公司已于四月早些时候证实…

STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系 本文并不将FATFS的相关接口操作&#xff0c;而是将HAL在使用FATFS通过SDIO外设管理SD卡时&#xff0c;内部函数的调用逻辑&#xff0c;有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现…

力扣LeetCode-链表中的循环与递归使用

标题做题的时候发现循环与递归的使用差别&#xff1a; 看两道题&#xff1a; 两道题都是不知道链表有多长&#xff0c;所以需要用到循环&#xff0c;用到循环就可以把整个过程分成多个循环体&#xff0c;就是每一次循环要执行的内容。 反转链表&#xff1a; 把null–>1…