LeetCode 289.生命游戏

LeetCode 289 生命游戏 Python LeetCode 289题 生命游戏: 题目描述: 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞... 阅读详情
289.生命游戏

在这里插入图片描述
在这里插入图片描述

思路:

从题目的设计来看,要求是根据当前的数组中每个值周边的值来更新当前值,但是前提是都是考虑的周边的原始值,而非更新后的值。

最开始想到的是先拷贝一个数组,但是题目中建议不使用额外空间解决,即在原数组上操作。

首先考虑的解决办法是位运算,因为原始值是int类型,有32位长度,而题中值只为0/1,那么仅仅占用了一个bit。

  • 位运算
    • 原来的第一位不改变,用第二位保存更新后的值。
    • 获取周边原始值的时候,只获取第一位的值进行判断。
    • 在整体更新完后,每个值进行位右移运算。
class Solution {
    public void gameOfLife(int[][] board) {
        int m = board.length;
        int n = board[0].length;
        int[] dx = new int[]{-1, 0, 1, -1, 1, -1, 0, 1};
        int[] dy = new int[]{-1, -1, -1, 0, 0, 1, 1, 1};
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int countLive = 0;
                for (int k = 0; k < 8; k++) {
                    int newX = i + dx[k];
                    int newY = j + dy[k];
                    if (newX < 0 || newX >= m || newY < 0 || newY >= n) {
                        continue;
                    }
                    countLive += board[newX][newY] & 1;
                }
                if (board[i][j] == 1) {
                    if (countLive == 2 || countLive == 3) {
                        board[i][j] |= 2;
                    }
                } else {
                    if (countLive == 3) {
                        board[i][j] |= 2;
                    }
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                board[i][j] >>= 1;
            }
        }
    }
}
  • 使用额外状态(参考解题思路的一种解法,类似位操作)
    • 与位运算不同的是,在原有的状态值0/1增加了两个新的细胞的状态值2/-1
    • -1代表细胞值由0变为1
    • 2代表细胞值由1变为0
class Solution {
    public void gameOfLife(int[][] board) {
        int m = board.length;
        int n = board[0].length;
        int[] dx = new int[]{-1, 0, 1, -1, 1, -1, 0, 1};
        int[] dy = new int[]{-1, -1, -1, 0, 0, 1, 1, 1};
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int countLive = 0;
                for (int k = 0; k < 8; k++) {
                    int newX = i + dx[k];
                    int newY = j + dy[k];
                    if (newX < 0 || newX >= m || newY < 0 || newY >= n) {
                        continue;
                    }
                    if (board[newX][newY] == 1 || board[newX][newY] == 2) {
                        countLive++;
                    }
                }
                if (board[i][j] == 1) {
                    if (countLive < 2 || countLive > 3) {
                        board[i][j] = 2;
                    }
                } else {
                    if (countLive == 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;
                }
            }
        }
    }
}

在这里插入图片描述

Leetcode 289:生命游戏(最详细的解法!!!) 根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡; 如果... 阅读详情

相关推荐

python【力扣LeetCode算法题库】289- 生命游戏

生命游戏 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞数少于两个,则...

NJU phd 在读。 759

【leetcode】289.生命游戏 (三种解法开阔思路,java实现)

289. 生命游戏 难度中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡; 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活; 如果活

Viper的程序员修炼手册 1077

【Leetcode】289.生命游戏

利用位信息进行数据压缩

明朗晨光的专栏 1128

【LeetCode】第289场单周赛 --- 用中等题来骗来偷袭我这个老同志?

LeetCode第 289 场周赛题目全盘解析,小白也能看得懂!

秋刀鱼与猫的博客 1万+

langchain4j+milvus实战

本文主要研究一下如何使用langchain4j来对接向量数据库milvus。

go4it 1474

WSL2下用QEMU模拟ARM开发板:从编译uboot到调试全流程(附常见错误解决)

本文详细介绍了在WSL2环境下使用QEMU模拟ARM开发板的完整流程,包括uboot编译、内核调试等关键步骤。通过QEMU模拟vexpress-a9开发板,开发者可以高效搭建嵌入式开发环境,解决常见错误并提升开发效率。

solidity8miner的博客 288

算法-生命游戏(289矩阵)

leetcode生命游戏,转化死活细胞

一个好学的低级程序猿 748

大型我的世界RPG服务器开服全攻略:从环境配置到插件部署

搭建一个能支撑百人稳定在线的我的世界服务器,远不止选择服务端和安装插件那么简单。服务器架设涉及硬件选型、Java环境、端口放行、启动脚本与systemd守护等基础环节,而大型RPG玩法还依赖MythicMobs、Quests、LuckPerms等插件协同工作。理解这些技术组件的原理与配置逻辑,是确保长线运营的关键。对于希望打造原创剧情、职业副本和自定义Boss的团队而言,合理规划MySQL数据库、RCON批量管理及性能调优,能显著降低后期维护成本。本文围绕RPG服务器核心能力,从环境准备到插件部署,再到常见

weixin_27230891的博客 370

leetcode 289. 生命游戏

复制份矩阵,然后就可以根据条件判断

邹九的个人博客 619

MMORPG网络游戏开发之任务系统的架构与设计

在网路游戏中做任务已经成为游戏很重要的一个核心功能和玩法,如何做好一个灵活可扩展的任务系统的架构与设计,今天来给大家分享一些我们的设计经验。接下来我把整个的任务系统分成以下6个模块:对于单机游戏而言,这6个模块都放在客户端直接处理,对于网路游戏而言,模块1~5实现在服务端,模块6实现在客户端。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。...

voidinit的专栏 3049

基于51单片机的多功能计算器全套设计

当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且人脑比较容易出错。计算器作为一种快速通用的计算工具方便了用户的使用。计算器可谓是我们最亲密的电子伙伴之一。本设计着重在于分析计算器设计开发过程中的环节和步骤,并从实践经验出发对计算器设计做了详细的分析和研究。 本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用5×8矩阵键盘,可以进行加、减、乘、除等十几种数字运算,同时支持括号

runweipa的博客 1744

【LeetCode】289.生命游戏

如何原地对数组进行修改是比较困难的,递归的算法无法做到。那有什么方式能简化吗?可以设计多种数字用于记录细胞的状态,不同的数字记录了不同的时刻和状态,从而简化了题目。

说文科技,做有态度的研究。 765

避开SM30维护视图的坑:自动更新字段+日志记录的5个关键配置步骤

本文深入解析了SAP ABAP开发中SM30维护视图的深度定制,聚焦于实现自动更新字段与日志记录功能。文章详细阐述了从SE54配置起点到核心编码的5个关键步骤,重点讲解了如何利用事件驱动模型(如05创建事件和01保存前事件)安全操作动态数据结构,并提供了避免常见陷阱的实用技巧,帮助开发者构建稳定可靠的自动化维护机制。

plant的博客 624

【中等】力扣算法题解析LeetCode289:生命游戏

本文介绍了康威生命游戏的算法实现,通过在二维网格上模拟细胞演化规则。关键点包括: 规则应用:基于细胞周围活细胞数,决定其存活、死亡或复活; 原地算法:使用中间状态(-1表示死亡中,2表示复活中)避免状态冲突; 高效遍历:方向数组简化8邻域统计,两次遍历完成状态更新。 代码(Java)通过标记中间状态后统一转换,确保所有细胞同步更新。适用于有限网格,边界处理通过坐标检查实现。

ylumwd的博客 1005

【3D Slicer】的小白入门使用指南一

3D Slicer 是一个免费的开源软件平台,用于医学、生物医学和其他 3D 图像的可视化、处理、分割、配准和分析。Slicer 的功能包括:读/写。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 5559

虚拟电厂功率预测最佳实践白皮书

虚拟电厂(VPP)通过聚合分散的可再生能源资源,为电网提供可观测、可调度和可交易的解决方案。本文提出了一套功率预测方法论,并给出LSTM实现脚本,涵盖资源接入、数据治理、预测模型设计及市场交易闭环。针对风-光-储-负荷混合场景,该方法论强调轻量化部署和滚动优化,可有效提升预测精度和调度收益。未来研究将融合深度气象预报和强化学习,进一步优化VPP的协同调度能力。

专注AI大模型,软件混淆,授权 377

leetCode力扣——289.生命游戏

根据,简称为,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含m × n个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1即为(live),或0即为(dead)。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是发生的。给你m x n网格面板board的当前状态,返回下一个状态。给定当前board的状态,board到下一个状态。你不需要返回任何东西。

Xiaoyuan_he的博客 413

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode289 生命游戏 Java实现

LeetCode289 题目 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡; 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活; 如果活

BedivereAlter的博客 605

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

leetcode-289:生命游戏

每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。输入: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.如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;1.如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;3.如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;输出:[[1,1],[1,1]]

菊头蝙蝠的博客 1264

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

289. 生命游戏【 力扣(LeetCode) 】

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

yyh520025的博客 552

LeetCode第289题_生命游戏

LeetCode 289 生命游戏解题摘要 本题要求模拟细胞自动机的状态转换规则。核心思路是遍历每个细胞,统计其8个相邻细胞的活细胞数量,根据规则确定下一状态。提供了两种实现方案:原地修改法使用特殊标记(2和-1)记录中间状态,最后统一更新;额外空间法则创建新数组存储结果。文中给出C#、Python、C++三种实现,重点展示了原地算法的状态编码技巧。该题考察数组操作和状态转换能力,适合算法进阶练习。时间复杂度O(mn),空间复杂度O(1)(原地法)或O(mn)(额外空间法)。

qq_40263592的博客 1028

LeetCode 289. 生命游戏

生命游戏

予早随笔 698

289. 生命游戏 - 力扣(LeetCode)

利用位运算,低位存储细胞当前状态,高位存储细胞周围活细胞的数目

Onwaier的博客 574

Leetcode—289. 生命游戏【中等】

Leetcode—289. 生命游戏【中等】

Atticus的博客 918

LeetCode #289 生命游戏 位运算

LeetCode #289 生命游戏 题目描述 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律: 如果活细...

阿玮的博客 316

LeetCode-289.生命游戏

这里是题目描述:LeetCode-289.生命游戏 想要题目要求的答案并不难,难点在于如何在原地(即O(1)时间复杂度)情况下求解答案:不开辟新的数组,直接在原数组上对元素置0或置1会影响后续元素的计算。为了不造成这种干扰,我们可以先为元素赋0、1以外的其他值,后面再根据这些值将元素置0或置1 方法一:为数组元素赋其他值 我们遍历两遍原数组,第一遍遍历检查每个元素borad[i][j]周围的活细胞...

qq_24210431的博客 260
上一篇: LeetCode 169.多数元素
下一篇: LeetCode 409.最长回文串
wxianyou
博客等级 码龄9年 1粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值