leetcode面试经典150题——38 生命游戏

题目:生命游戏

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

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

1.如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
2.如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
3.如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
4.如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。
leetcode链接
在这里插入图片描述
输入: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]]

方法一:使用额外矩阵
由题目可知,我们遍历矩阵里面的每一个细胞,然后统计它周围8个细胞活细胞的数量,按照题目所设条件,如果活细胞的数量大于3个或者小于2个,那么该活细胞变死细胞,如果活细胞的数量为3个,那么该死细胞变为活细胞,为了避免我们使用到更新后的细胞状态,我们把更新后的细胞状态存储到我们定义的新的矩阵中。
时间复杂度:o(mn)
空间复杂度:o(mn)

 void gameOfLife(vector<vector<int>>& board) {int n = board.size();int m = board[0].size();vector<vector<int> > new_board = board;for(int i=0;i<n;i++){for(int j=0;j<m;j++){int hnums = count(board,i,j);if((hnums<2||hnums>3)&&board[i][j]==1){//周围活细胞小于2个或者大于3个,该活细胞变成死细胞new_board[i][j] = 0;}else if(hnums==3&&board[i][j]==0){//周围活细胞数量为3个,该死细胞复活new_board[i][j] = 1;}        }}board = new_board;//最后复制为原矩阵中
}
int count(vector<vector<int> > nums,int row,int col){int hnums = 0;;for(int i = row-1;i<row+2;i++){for(int j =col-1;j<col+2;j++){if(i>=0&&j>=0&&i<nums.size()&&j<nums[0].size()&&nums[i][j]==1){hnums++;}}}return nums[row][col]==1?hnums-1:hnums;
}

方法二:使用额外的状态
在方法一中我们算法的时间复杂度为o(mn),我们现在考虑原地解决该问题,在方法一中,如果我们步额外申请矩阵来存储,那么我们对于更新后的细胞状态,在后续使用时,会丢失掉原本最初的细胞状态,因此会得到错误的结果,那么我们要怎么样在既得到变化后的状态又能够得到最初的状态呢,我们为了解决这个问题,引入额外的两种状态-1和2,第一种-1状态表示细胞原本是活细胞,更新后变为死细胞,第二种2状态表示细胞原本是死细胞,更新后变为活细胞,那么我们在统计活细胞的时候,状态1和-1都表示原本是活细胞,这样就能解决既得到变化后的状态又能够得到最初的状态,最后我们只需要对我们新引入的状态对其还原即可。
时间复杂度:o(mn)
空间复杂度:o(1)

void gameOfLife(vector<vector<int>>& board) {int n = board.size();int m = board[0].size();for(int i=0;i<n;i++){for(int j=0;j<m;j++){int livenums = count(board,i,j);//周围活细胞的数量if((livenums>3||livenums<2)&&board[i][j]==1){//周围活细胞数量超过三个或者少于两个,该活细胞变成死细胞board[i][j] = -1;}else if(livenums==3&&board[i][j]==0){//周围活细胞的数量为3个,那么该死细胞变成活细胞board[i][j] = 2;}}}//最后把我们新定义的状态恢复for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(board[i][j]==2){board[i][j] = 1;}else if(board[i][j]==-1){board[i][j] = 0;}}}
}
//统计活细胞的数量
int count(vector<vector<int> > nums,int row,int col){int hnums = 0;;for(int i = row-1;i<row+2;i++){for(int j =col-1;j<col+2;j++){if(i>=0&&j>=0&&i<nums.size()&&j<nums[0].size()&&(nums[i][j]==1||nums[i][j]==-1)){//原本是活细胞的值可能是1或者-1hnums++;}}}return nums[row][col]==1?hnums-1:hnums;
}

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

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

相关文章

【LeetCode刷题】--245.最短单词距离III

245.最短单词距离III class Solution {public int shortestWordDistance(String[] wordsDict, String word1, String word2) {int len wordsDict.length;int ans len;if(word1.equals(word2)){int prev -1;for(int i 0;i<len;i){String word wordsDict[i];if(word.equa…

Codeforces Round 916(Div.3) A~G

A.Problemsolving Log(计数) 题意&#xff1a; 有 26 26 26个问题 A ∼ Z A \sim Z A∼Z&#xff0c;分别需要尝试 1 ∼ 26 1 \sim 26 1∼26次才能通过。 给出一个字符串&#xff0c;里面包含的每个字母代表着这道题目的一次尝试&#xff0c;问&#xff1a;总共通过了多少题…

前端已死?探讨人工智能与低代码对前端的影响

文章目录 每日一句正能量前言前端行业究竟是好是坏&#xff1f;数字化转型的当下前端工程师该何去何从&#xff1f; 想要入行前端先认清这三个事实 后记 每日一句正能量 人的结构就是相互支撑&#xff0c;众人的事业需要每个人的参与。 前言 随着人工智能和低代码的崛起&#…

【DOM笔记四】事件高级!(注册/删除事件、DOM事件流、事件对象、事件委托、鼠标 / 键盘事件、相关案例)

文章目录 7 事件高级7.1 注册事件概述7.2 删除事件7.3 DOM事件流7.4 事件对象7.5 事件委托7.6 鼠标事件7.6.1 常用的鼠标事件7.6.2 鼠标事件对象 7.7 键盘事件7.7.1 常用的键盘事件7.7.2 键盘事件对象 7 事件高级 7.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或…

【ECharts】折线图

文章目录 折线图1折线图2折线图3示例 参考&#xff1a; Echarts官网 Echarts 配置项 折线图1 带X轴、Y轴标记线&#xff0c;其中X轴是’category’ 类目轴&#xff0c;适用于离散的类目数据。 let myChart echarts.init(this.$refs.line_chart2); let yList [400, 500, 6…

关于“Python”的核心知识点整理大全31

目录 12.4.2 在屏幕上绘制飞船 alien_invasion.py ​编辑12.5 重构&#xff1a;模块 game_functions 12.5.1 函数 check_events() game_functions.py alien_invasion.py 12.5.2 函数 update_screen() game_functions.py alien_invasion.py 12.6 驾驶飞船 12.6.1 响应…

RESTful简介与C/C++实现

一、RESTful简介 RESTful&#xff0c;全称为Representational State Transfer&#xff0c;是一种软件架构风格和设计理念&#xff0c;而不是一种标准。它主要用于Web服务的设计和开发&#xff0c;强调资源的状态表示和状态转移。RESTful风格的设计使得Web服务更加简洁、清晰和…

msvcp120.dll丢失的多种详细有效解决方法

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。那么&#xff0c;msvcp120.dll到底是什么&#xff1f;为什么会出现丢失的情况&#xff1f;丢失后会对电脑产生什么影响&#xff1f;本文将为您详细解答这些问题&#…

HarmonyOS笔记1

修改字体颜色 在Text里边&#xff0c;按一下 . 就行了&#xff0c;按点号会自动提示 fontColor 函数参数给‘#36D’可以把‘Hello World’调成蓝色 onClick(()>{}) 按钮 如何打印第二句话 Text方法 2023年12月21日11:26:52

项目从0到1,架构选型 :单体架构优先考虑

当我听到关于团队使用微服务架构的故事时&#xff0c;我注意到了一个共同的现象。 几乎所有成功的微服务故事都是从一个过于庞大的庞然大物开始的&#xff0c;后来这个庞然大物被拆分了我所听说的几乎所有从零开始构建微服务系统的案例&#xff0c;最终都陷入了严重的麻烦。 …

强烈推荐的前端学习资源,先收藏!

今天分享一些个人收藏的前端学习资源&#xff0c;按一下几个维度简单划分了下&#xff0c;有 3D、框架、构建工具等等。由于这些地址都是我个人收藏的&#xff0c;所以带有一些强烈的主观意识&#xff0c;还有很多优秀的网址没有收录进来&#xff0c;会不断更新的&#xff0c;欢…

系统分析师(软考)知识点整理(二)

会计相关 会计是指记录、分类、汇总、计量和报告发送在企业经济活动中的财务数据的行为 #mermaid-svg-YBI5YPWzqWhRB4kI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YBI5YPWzqWhRB4kI .error-icon{fill:#552222…

亚马逊鲲鹏系统引爆广告点击率提升秘籍

在竞争激烈的电商市场&#xff0c;提高广告点击率成为各大卖家争相追求的目标。而如今&#xff0c;亚马逊鲲鹏系统的强大功能再次为卖家们打开了广告优化的新大门。其中&#xff0c;搜索广告功能更是成为提高关键词排名的利器。本文将详细介绍如何通过亚马逊鲲鹏系统实现点击广…

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现KOA-CNN-B…

linux | 软连接与硬链接 | 实测

很多知识&#xff0c;我们都是通过学习其他博主的博客&#xff0c;可是学习的过程 常常需要辩证的去辨别真伪。这很耗精力&#xff0c;最好的方法就是实践去检测。 软链接 和 应链接 在 linux 上操作非常重要 常见场景&#xff1a;最重要的就是&#xff0c;做备份&#xff0c;尤…

Talk | 约翰霍普金斯大学博士生魏晨: De-Diffusion-文本是不同模态的沟通桥梁

本期为TechBeat人工智能社区第557期线上Talk。 北京时间12月20日(周三)20:00&#xff0c;约翰霍普金斯大学博士生—魏晨的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “De-Diffusion-文本是不同模态的沟通桥梁题”&#xff0c;介绍了她的团队在如…

Linux---进程状态

目录 一、系统进程状态介绍 1.运行状态 2.阻塞状态 3.挂起状态 二、Linux中的进程状态 1.R (running) 2.S (sleeping) 3.D&#xff08;disk sleep&#xff09; 4.T&#xff08;stopped&#xff09; 5.t&#xff08;tracing stop&#xff09; 6.X&#xff08;dead&am…

OpenHarmony应用开发环境搭建指南

OpenHarmony的应用开发主要是基于Deveco Studio&#xff08;目前只支持Windows及Mac平台&#xff09;搭配相应的SDK进行&#xff0c;现对开发环境的搭建进行说明。 1:Deveco下载安装 下载对应平台的安装包即可。接下来以Windows平台为例&#xff0c;进行开发环境的搭建。 下载…

楼宇对讲、可视门铃案例分析

语音通话芯片&#xff1a;D34018,D34118,D5020,D31101; D34018 单片电话机通话电路&#xff0c;合并了必 需的放大器、衰减器和几种控制 功能&#xff0c;包括发送和接收衰减器、 背景噪声电平检测系统和一个衰 减器控制系统&#xff0c;对发送和接收电 平好于背景噪声做出反…