稀碎从零算法笔记Day33-LeetCode:生命游戏

今天是“耶稣受难人”,笔者给自己放了天假hhh

且慢,还是会写一点的。

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

题型:矩阵、原地实现、位运算

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

来源:LeetCode

题目描述

给定一个包含 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(非常人性化的矩阵设计,给了许多可能)

进阶:

  • 你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
  • 本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?

题目思路

一个理解起来不难,但可能实现起来比较麻烦的矩阵模拟题。

抛开要求的【原地】不谈外,用一个新的二维数组辅助,在遍历也感觉很麻烦,外加空间复杂度直接干到了O( row * column)

那么可以考虑下题目要求的【原地】——即O(1)怎么实现。

笔者愚笨,在看了题解+评论区 2h后,才明白这套【原地+二进制表示法】。

这边先说一下,二进制(笔者只写0-3,所以2位足够)中:0是00,1是01,2是10,3是11 。
先说一下表示方法:用0表示【死细胞】状态,1表示【活细胞】状态。涉及两位数,那么【01】就是【由活向死】,【10】就是【由死向活】。那么如何实现这个状态的转化呢?这边就要用到二进制的【右移】操作(推荐自己在纸上写一下)。描述的话:假设数字的右边是个悬崖,有碾压墙把数字右推。数字右移1位,那么最右边那个就‘消失’了,【10】也就变成了【01】。

说完这个二进制表示状态的思路后,剩下的就是【原地】。这边原地笔者是先遍历【第一行】和【第一列】,确定他们会不会转化为【全0】(后面单独处理就好)。之后抛开这一行一列,遍历剩下的矩阵,按照规则找到每个点的【活细胞数】,进而确定状态。

最后通过右移操作,将矩阵更新为新的【0-1矩阵】

C++代码

class Solution {int rowLen,columnLen;
public:   void gameOfLife(vector<vector<int>>& board) {// 评论区双位表示细胞状态// 00  : 第一位表示未来 ,第二位表示现在。现在 -> 未来 右移一位。rowLen = board.size();columnLen = board[0].size();int life;for(int i=0;i<rowLen;i++){for(int j=0;j<columnLen;j++){life = getLife(i,j,board);//获取周围有几个活细胞// cout<<life<<endl;// 当前是活细胞if(board[i][j] == 1){if(life == 2 || life == 3)board[i][j] += 2;// 否则未来就会死,01,保持不变}else{//死细胞从 00 变成 10 if(life == 3)board[i][j] += 2;}}}for(auto &answer : board)//用引用,来改变原数组的值for(int &ans : answer ){// 全都右移1位ans = ans>>1;}}int getLife(int row, int column,vector<vector<int>> numpy){int life = 0;//不能有{0,0} 因为 board[row][column]相当于当前元素vector<vector<int>> lifeNumpy = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//8个状态数组,为了求出周围8个细胞的状态for(int i = 0;i < 8;i++){int x = row - lifeNumpy[i][0];int y = column - lifeNumpy[i][1];if(x<0 || x>=rowLen || y<0 || y >= columnLen)//矩阵外的细胞不处理continue;//因为board的元素除了0就是1,相当于统计周围1的个数life += numpy[x][y]&1;//应该只看最末一位,因为board不断变,状态只看原来的}return life;}     
};

结算页面

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

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

相关文章

Python Flask Web框架初步入门

前言 flask基础 搭建flask服务器 定义html 使用templates模板定义页面的html html页面编写 render_template传参变量 定义图片 创建static目录&#xff0c;存入图片 html编写 flask入门 网站多域名 网站之间超链接跳转 入门案例 将centos的rpm包下载链接集成到自…

Discourse 用户可以自己修改用户名吗

Discourse 是可以修改用户名的&#xff0c;但用户修改自己的用户名会有时间的限制。 这是因为根据官方的说法就是当用户修改用户名后可能会导致内容的失效等问题。 在默认的安装配置下&#xff0c;用户可以在完成注册后的 3 天自己对用户名进行修改。 3 天以后&#xff0c;用…

在jupyter notebook中使用conda环境

在jupyter notebook中使用conda环境 1. 环境配置 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda install nb_cond…

Docker Desktop 在 Windows 上的安装和使用

目录 1、安装 Docker Desktop 2、使用 Docker Desktop &#xff08;1&#xff09;运行容器 &#xff08;2&#xff09;查看容器信息 &#xff08;3&#xff09;数据挂载 Docker Desktop是Docker的官方桌面版&#xff0c;专为Mac和Windows用户设计&#xff0c;提供了一个简…

RN在android/ios手机剪切图片的操作

之前写过一个React Native调用摄像头画面及拍照和保存图片到相册全流程但是这个仅限于调用摄像头拍照并保存图片,今天再写一个版本的操作,这个博客目前实现的有三点操作: 调用摄像头拍照对照片进行剪切从相册选取图片 功能上面来说有两点: 点击按钮可以对摄像头进行拍照,拍完照…

需要本地后端的真机调试-微信

打开和修改IP改为电脑与手机同一局域网的 不知道这个要不要

FL Studio21中文版百度云网盘下载及切换中文语言教程

FL Studio 21&#xff0c;即广为人知的“水果”软件&#xff0c;拥有众多强大的功能&#xff0c;满足了音乐制作人在创作过程中的各种需求。 首先&#xff0c;它具备出色的多轨道音频录制功能&#xff0c;能够同时处理多个音频轨道的录制&#xff0c;非常适合制作复杂的音乐作…

MySQL Server 8.3.0 重要变更解析

MySQL Server 8.3.0 Innovation 版本是 MySQL 8.x 系列最后一个创新版本&#xff0c;下个月即将迎来 MySQL 8.4.0 LTS 长期支持版本。 关于发版模型变更&#xff0c;在之前的文章 重磅&#xff01;MySQL 8.1.0 已来&#xff01; 中已有所介绍。 这里补充一点&#xff0c;对于 M…

顶顶通呼叫中心中间件-声音编码自适应配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-声音编码自适应配置方法讲解(mod_cti基于FreeSWITCH) 声音编码自适应介绍 声音编码自适应&#xff0c;通常在语音通信和音频处理领域中指的是一种能够根据信号特性和传输环境自动调整编码参数的技术。其目的是在不同的网络状况和音质要求下&#xff0c;…

【php程序开发从入门到精通】——搭建PHP开发环境

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Java集成E签宝实现签署

完整代码&#xff1a;java-boot-highpin-background: 背调服务 (gitee.com) 【暂不开源】 1.在application.yml中配置appid、密钥信息&#xff0c;包含沙箱环境javaesign:host: https://smlopenapi.esign.cnappId: your appIdappSecret: your secret 2.实现电子签的主要流程在…

Centos7 elasticsearch-7.7.0 集群搭建,启用x-pack验证 Kibana7.4用户管理

前言 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎&#xff0c;能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心&#xff0c;它集中存储您的数据&#xff0c;帮助您发现意料之中以及意料之外的情况。 环境准备 软件 …