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

news2025/1/15 23:03:57

一、题目描述

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 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.coloradmin.cn/o/2199133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何运行服务器上的web页面,打开Outlook 365的全球离线通讯簿功能?

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

Linux入门攻坚——35、Linux防火墙-iptables-1

Firewall&#xff1a;防火墙&#xff0c;就是一个隔离工具。工作于主机或网络的边缘&#xff0c;对于进出本主机或网络的报文根据事先定义好的检查规则做匹配检测&#xff0c;对于能够被规则所匹配到的报文做出相应处理的组件&#xff1a;这个组件可以是硬件&#xff0c;也可以…

WPS的JS宏实现删除某级标题下的所有内容

想要删除Word文档中&#xff0c;包含特定描述的标题下所有内容&#xff08;包含各级子标题以及正文描述&#xff09;。 例如下图中&#xff0c;想删除1.2.1.19.1业务场景下所有内容&#xff1a; 简单版&#xff1a; 删除光标停留位置的大纲级别下所有的内容。实现的JS代码如下…

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单&#xff0c;有很大限制&#xff0c;我们需要更多复杂模式 蓝色是线性模型&#xff0c;线性模型无法去表示…

ubuntu 开放 8080 端口快捷命令

文章目录 查看防火墙状态开放 80 端口开放 8080 端口开放 22端口开启防火墙重启防火墙**使用 xhell登录**&#xff1a; 查看防火墙状态 sudo ufw status [sudo] password for crf: Status: inactivesudo ufw enable Firewall is active and enabled on system startup sudo…

Flutter 3.24 发布:GPU模块及多视图嵌入功能

Flutter 3.24 发布&#xff1a;GPU模块及多视图嵌入功能 Flutter 3.24 带来了许多新功能和改进&#xff0c;让开发应用程序变得更加容易和有趣。这个版本重点展示了 Flutter GPU 的预览功能&#xff0c;让应用程序可以直接使用高级图形和 3D 场景功能。 此外&#xff0c;网页…

传智杯 第六届—B

题目&#xff1a; 擂台赛要开始了&#xff0c;现在有 n 名战士&#xff0c;其中第 i 名战士的战斗力为 ai​。现在准备从这些战士中挑两名战士进入擂台赛进行对战&#xff0c;由于观众们更喜欢看势均力敌的比赛&#xff0c;所以我们也要挑选两个战斗力尽可能相近的战士进行参赛…

Linux-分析 IO 瓶颈手册

分析IO瓶颈 此文主要内容&#xff1a;I/O性能重要指标、主要排查工具、主要排查手段、工具图示 磁盘 I/O 性能指标 四个核心的磁盘 I/O 指标 使用率&#xff1a;是指磁盘忙处理 I/O 请求的百分比。过高的使用率&#xff08;比如超过 60%&#xff09;通常意味着磁盘 I/O 存在…

Spring系列 Bean的生命周期

文章目录 初始化时机单例初始化流程getBeandoGetBeangetSingleton(String) 获取单例getSingleton(String, ObjectFactory) 创建单例beforeSingletonCreationcreateBeanafterSingletonCreation createBean 创建对象doCreateBeanaddSingletonFactory createBeanInstance 创建 Bea…

基于springboot vue 学生就业信息管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

水库大坝安全监测预警系统守护大坝安全卫士

一、系统背景 近年来&#xff0c;受全球气候变化和人类活动影响&#xff0c;极端天气发生频度强度增加&#xff0c;加之我国城市化进程中&#xff0c;水库下游人口聚集、基础设施密集&#xff0c;对水库工程安全运行提出了新的更高要求。“十四五”以来我国建成并投入使用37593…

NeRS: Neural Reflectance Surfaces for Sparse-view 3D Reconstruction in the Wild

1. 2.优点1&#xff1a;我们的方法仅依赖于近似的相机位姿估计和粗略的类别级形状模板。 3.我们的关键见解是&#xff0c;我们可以强制执行基于表面的 3D 表示&#xff0c;而不是允许广泛用于体积表示的无约束密度。重要的是&#xff0c;这允许依赖于视图的外观变化 4.更重要…

迪士尼数据泄露事件:全面审视数据安全策略与未来防护方向

迪士尼数据泄露事件概述 一、 事件背景以及影响 在全球数字化转型加速的浪潮中&#xff0c;数据安全已成为企业运营不可忽视的基石。 华特迪士尼公司&#xff0c;作为全球知名的娱乐传媒巨头&#xff0c;其数据泄露事件无疑为业界敲响了警钟。此次事件不仅揭示了数据保护的严…

从0开始下载安装并使用unity

首先我们要在浏览器上找到unity的官网 这一个就是了&#xff0c;我们点进去后是这个界面&#xff1a; 然后我们点击上面这张图的左下角的“下载Unity Hub”&#xff0c;推荐后续安装都装在D盘&#xff1a; 这里他会让我们注册一个账号&#xff0c;如果之前有的话登录就行了&am…

2024年第二届龙信杯 WP

2024年龙信杯 author&#xff1a;mumuzi date&#xff1a;2024/9/30 取证的一手更新都在自己的博客上&#xff0c;分区为Forensic&#xff0c;https://mumuzi7179.github.io/或https://mumuzi.blog/ DK盾云服务器&#xff1a;DK盾 镜像下载地址&#xff1a; https://pan.ba…

i18n多语言项目批量翻译工具(支持84种语言)

这里写自定义目录标题 打开‘i18n翻译助手’小程序快捷访问 打开‘i18n翻译助手’小程序 1.将需要翻译的json文件复制到输入框&#xff08;建议一次不要翻译过多&#xff0c;测试1000条以内没什么问题&#xff09; 2.等待翻译 3.翻译完成&#xff0c;复制结果 快捷访问

极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

SpringBoot框架:服装生产管理的智能助手

4 系统设计 4.1 系统结构设计 在结构设计过程中&#xff0c;首先对系统进行需求分析&#xff0c;然后进行系统初步设计&#xff0c;将系统功能模块细化&#xff0c;具体分析每一个功能模块具体应该首先哪些功能&#xff0c;最后将各个模块进行整合&#xff0c;实现系统结构的…

室内人行与导航系统有哪些多样化的功能?

在现代化建筑的迷宫中&#xff0c;室内人行与导航系统如同一位无形的向导&#xff0c;引领我们穿梭于复杂的空间之中&#xff0c;极大地提升了人们在室内环境中的便捷性和安全性。这一技术领域的飞速发展&#xff0c;不仅体现在定位精度的提升上&#xff0c;更在于其多样化的功…

如何自己动手实现一个图片解答小助手

有一张图片如下所示&#xff1a; Kimi上有一个功能&#xff0c;就是解析图片内容&#xff0c;给出回答&#xff1a; 这样可以用于拍照向AI提问的场景&#xff0c;我自己也有这方面的需求&#xff0c;因此动手实践了一下。 自己动手实现的效果如下所示&#xff1a; 那么自己如何…