LeetCode 289.生命游戏————2024 春招冲刺百题计划

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

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

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

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

在这里插入图片描述
输入: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]]
思路
一年多没做人都傻了啊啊啊啊啊
本题主要用
原地算法:基本不占用额外空间,在不改变原本数据附带的信息的条件下,为数据附上新的信息。
答案
好像会比一般的多跑4ms,为什么为什么?

class Solution {
public:void gameOfLife(vector<vector<int>>& board) {//00:死死,01:活死,10:死活,11活活 改变后改变前int n = board.size();int m = board[0].size();int d[8][2] = {{1,0},{0,1},{1,1},{-1,0},{0,-1},{-1,-1},{1,-1},{-1,1}};for(int i = 0; i < n; i ++){for(int j = 0; j < m; j++){int cnt = 0;        	for(int k = 0; k < 8; k++){if((i+d[k][0] >= 0)&&(i+d[k][0] < n)&&(j+d[k][1] >= 0)&&(j+d[k][1] < m)){cnt += board[i+d[k][0]][j+d[k][1]]&1;//只考虑最末位,即上一个状态} }if(board[i][j]) board[i][j] = (cnt == 2||cnt == 3)?3:1;else board[i][j] = cnt == 3?2:0;}}for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){board[i][j] >>= 1;}}}
};

官方答案

class Solution {// 状态用2bit表示,最末位为0表示现在死亡,倒数第二位为0表示下一时刻死亡// 00:死 01:活变死 10:死变活 11:活int rows;int cols;public void gameOfLife(int[][] board) {if (board == null || board[0] == null) {return;}rows = board.length;cols = board[0].length;// 第一轮遍历:计算每个细胞下一时刻状态for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {int liveNum = getLiveNum(board, row, col);if (board[row][col] == 1) {  // 规则1、2、3,即判断活细胞下一时刻状态board[row][col] += (liveNum == 2 || liveNum == 3) ? 2 : 0;}else {  // 规则4,即判断死细胞下一时刻状态board[row][col] += liveNum == 3 ? 2 : 0;}}}// 第二轮遍历:变更每个细胞的状态for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {board[row][col] >>= 1;}}}private int getLiveNum(int[][] board, int row, int col) {int liveNum = 0;int[][] posList = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};for (int[] pos : posList) {int x = row + pos[0];int y = col + pos[1];if (x < 0 || x >= rows || y < 0 || y >= cols){continue;}liveNum += board[x][y] & 1;  // 只考虑最末位,即当前状态}return liveNum;}
}

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

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

相关文章

【LeetCode热题100】【回溯】单词搜索

题目链接&#xff1a;79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 要在一个二维数组里面找到一条单词路径&#xff0c;可以先遍历二维数组找到单词入口&#xff0c;然后往上下左右深度遍历&#xff0c;访问过的元素直接修改成字符串结束符&#xff0c;访问完改回去 …

荣誉 | 人大金仓获评轨交行业“智慧运维优秀应用案例”

4月12日至13日&#xff0c;2024&#xff08;第八届&#xff09;中国城市轨道交通智慧运维大会在成都顺利举行。会上&#xff0c;人大金仓以其在轨交行业的卓越贡献和创新实践&#xff0c;获评“智慧运维优秀应用案例”。公司副总裁梁红凤出席大会并发表了题为“打造世界一流的数…

XXL-JOB v2.4.1 版本正式发布!

v2.4.1 Release Notes 1、【优化】多个项目依赖升级至较新稳定版本&#xff0c;涉及 netty、groovy、springboot、mybatis 等&#xff1b;2、【修复】“CVE-2022-43402” groovy 低版本漏洞修复。3、【修复】“CVE-2024-29025” netty 低版本漏洞修复。4、【修复】“CVE-2024-…

kali工具----枚举工具

一、枚举工具 枚举是一类程序&#xff0c;它允许用户从一个网络中收集某一类的所有相关信息。本节将介绍DNS枚举和SNMP枚举技术。DNS枚举可以收集本地所有DNS服务和相关条目。DNS枚举可以帮助用户收集目标组织的关键信息&#xff0c;如用户名、计算机名和IP地址等&#xff0c;…

最新的网易星球GEC挖矿系统修复版 章鱼星球挖矿系统源码 区块链虚拟币交易源码 基于ThinkPHP5开发

区块链系统介绍 2018.12.10更新增加聚合数据短信接口 2018.11.19更新增加短信宝接口 2018.08.17修复Linux系统搭建验证码不显示问题 2018.08.09修复后台某处溢出数据库账号密码BUG 2018.08.06修复票卷BUG 源码介绍&#xff1a; 区块链系统中用户共九个等级&#xff0c;依…

ECA-Net:深度卷积神经网络中的高效通道注意力机制【原理讲解及代码!!!】

ECA-Net&#xff1a;深度卷积神经网络中的高效通道注意力机制 在深度学习领域&#xff0c;特别是在深度卷积神经网络&#xff08;DCNN&#xff09;中&#xff0c;注意力机制已经成为提升模型性能的关键技术之一。其中&#xff0c;ECA模块&#xff08;Efficient Channel Attent…

数字乡村探索:引领农村未来发展新方向——科技创新赋能乡村现代化与农民生活品质提升之旅

目录 一、数字乡村的内涵与特点 二、数字乡村的探索进展 三、数字乡村面临的挑战与机遇 四、数字乡村的未来发展方向与路径 五、数字乡村助力农村产业升级 六、数字乡村促进城乡融合发展 七、数字乡村激发农民创新创业活力 八、数字乡村提升农民获得感和幸福感 九、展…

35. UE5 RPG制作火球术技能

接下来&#xff0c;我们将制作技能了&#xff0c;总算迈进了一大步。首先回顾一下之前是如何实现技能触发的&#xff0c;然后再进入正题。 如果想实现我之前的触发方式的&#xff0c;请看此栏目的31-33篇文章&#xff0c;讲解了实现逻辑&#xff0c;这里总结一下&#xff1a; …

租赁系统成品|租赁小程序开发|租赁软件开发功能

在当前数字化时代&#xff0c;在线租赁平台成为了企业发展的重要推动器。本文将探讨在线租赁平台的特点与优势&#xff0c;以及其对用户和商家的租赁体验带来的影响。 首先&#xff0c;每个在线注册用户都需要通过实名身份验证进行在线身份验证。这项安全措施可以更好地保护租户…

Spring-tx事务管理

第五章 Spring声明式事务 一 声明式事务概念 1.1 编程式事务 手动编写程序来管理事务&#xff0c;即通过编写代码的方式来实现事务的提交&#xff0c;和回滚。 1.2 声明式事务 声明式事务是指使用注解或配置文件来控制事务的提交和回滚。 开发者只需要添加注解或者配置文…

视觉SLAM学习打卡【11】-尾述

到目前为止&#xff0c;视觉SLAM14讲已经到了终章&#xff0c;历时一个半月&#xff0c;时间有限&#xff0c;有些地方挖掘的不够深入&#xff0c;只能在后续的学习中更进一步。接下来&#xff0c;会着手ORB-SLAM2的开源框架&#xff0c;同步学习C。 视觉SLAM学习打卡【11】-尾…

AI 文献综述工具

find sources that support this statement: