【LeetCode】生命游戏 [M](矩阵)

news2024/9/20 20:28:09

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

一、题目

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

进阶:

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

二、代码

class Solution {
    public void gameOfLife(int[][] board) {
        int m = board[0].length;
        int n = board.length;
        // 遍历所有位置,根据每一个位置周围1的数量来判断这个细胞是活还是死
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int curOneCnt = getOneCnt(board, i, j);
                // 利用位信息,就可以不适用辅助数组了,同事保留旧信息和新信息
                // 如果周围有3个1,那么这个细胞下一步已经活
                if (curOneCnt == 3) {
                    // 用末位的前一位来标识下一步的状态信息,所以和2取或运算
                    board[i][j] |= 2;
                // 如果当前位置细胞是活的,并且它的周围有2个活细胞,那么下一步他也是活的    
                } else if (curOneCnt == 2 && board[i][j] == 1) {
                    board[i][j] |= 2;
                }

                // 除了上面的情况以外,其他全部都是死
            }
        }
        
        // 将每一个位置的信息右移一位,将旧信息抹去,只保留新信息
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                board[i][j] >>= 1;
            }
        }
    }
    
    // 统计(i,j)位置周围有多少个1
    public int getOneCnt(int[][] board, int i, int j) {
        return check(board, i - 1, j - 1) +
            check(board, i - 1, j) +
            check(board, i - 1, j + 1) +
            check(board, i, j - 1) +
            check(board, i, j + 1) +
            check(board, i + 1, j - 1) +
            check(board, i + 1, j) +
            check(board, i + 1, j + 1);
    }

    public int check(int[][] board, int i, int j) {
        int m = board[0].length;
        int n = board.length;
        // 如果当前位置不越界,并且这个位置的末位信息是1,那么就说明这个位置的细胞是活的,返回1,否则返回0
        return i >= 0 && i < n && j >= 0 && j < m && (board[i][j] & 1) == 1 ? 1 : 0;
    }
}

三、解题思路 

用位信息做压缩。

旧的信息的用二进制最末位的值表示,新的信息用旧信息的前一位表示,这样都设置完了之后直接将数据右移一位,将旧信息抹去就可以了。

用原始空间完成辅助空间的作用

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

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

相关文章

2023年mybatis常见面试题10道

1. MyBatis是什么&#xff1f;Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生…

Hyper-V三种虚拟网络类型的理解

Windows 10除家庭版之外都内置了Hyper-V&#xff0c;但是Win10系统上Hyper-V虚拟网络的设置方法却与之前版本的Hyper-V有些不同&#xff0c;最近在折腾了无数遍之后&#xff0c;总算有些心得&#xff1a;先说说虚拟网络的三种类型。Hyper-v支持外部、内部、专用三种网络&#x…

蓝桥杯STM32G431RBT6学习——定时器中断

蓝桥杯STM32G431RBT6学习——定时器中断 前言 从网络上的资料来看&#xff0c;蓝桥杯嵌入式好像并不考外部中断&#xff08;毕竟通常只是个按键应用&#xff09;&#xff0c;因此跳过进行定时器的学习。 STM32单片机的定时器通常分为高级定时器、通用定时器、基本定时器三种&…

111、【树与二叉树】leetcode ——669. 修剪二叉搜索树:递归法(C++版本)

题目描述 解题思路 本题的关键是用好递归这个结构&#xff0c;用好每次他向下的遍历和返回的值。每一次递归时&#xff0c;相当于解决与之前相同的问题&#xff0c;因此先按某一种类子问题进行讨论&#xff08;仅有三个结点的满二叉树&#xff09;&#xff0c;当递归的方式向下…

二本学历5年经验的程序员,出去面试被碾压~

目录 1、从一个求职案例引入2 、学历差距&#xff1a;面试官的第一印象3、公司背景差距&#xff1a;你的人生名片4、技术差距&#xff1a;硬核能力的欠缺5、架构能力的差距6、面试结果的分析 这篇文章&#xff0c;聊一个很多人感兴趣的话题&#xff0c;小公司的Java工程师和大…

计网必会:HTPP详解、cookie、缓存

文章目录应用层协议Web和HTTPHTTP 概述采用非持续连接的HTTPRTT 往返时间的定义**三次握手过程**采用持续连接的HTTPHTTP到底采用哪个&#xff1f;HTTP 的报文格式请求报文功效格式响应报文状态码格式Cookie什么是cookieWeb缓存在学习的过程很多人都遇到了HTTP和Cookie&#xf…

【matplotlib】19.基本用法

#【matplotlib】19.基本用法 2021.1.19 画figure图基本方法。参考&#xff1a; https://m.runoob.com/matplotlib/matplotlib-pyplot.html https://mofanpy.com/tutorials/data-manipulation/plt/figure matplotlib 是python的画图包 19.1 基础使用 plot图&#xff0c;就是以…

JavaEE2-Spring核心与设计思想

目录 1.Spring是什么&#xff1f; 2.容器是什么&#xff1f; 3.IoC是什么&#xff1f; 3.1.传统程序开发 3.2.控制反转式程序开发 3.3.对比总结规律 4.理解Spring IoC 4.1.将对象(Bean)存入到容器(Spring)&#xff1b; 4.2.从容器中取出对象。 5.DI概念说明 1.Spring…

LINUX---进程

目录相关概念1.什么是程序&#xff0c;什么是进程&#xff0c;有什么区别2.如何查看系统中有哪些进程3.进程标识符4.父进程&#xff0c;子进程5.C程序的存储空间是如何分配的创建进程函数forkvforkfork创建进程:vfork创建进程&#xff1a;进程退出正常退出&#xff1a;异常退出…

在XXX中找到了XXX的副本,但是当前代码与XXX中内置的版本不同【几种解决方案】

Microsoft VS警告类似如图所示&#xff1a; 然后发现编译编写好的代码无法打断点。定义的变量无法获取。 方案一&#xff1a; 把提示的该文件备份在其他文件夹一份&#xff0c;然后在项目中删除该文件。再把备份的文件放到该项目中。然后再编译。 方案二&#xff08;参考该博客…

Udev设备管理器

udev 引入 在2.4内核中 引入了 devfs&#xff0c;他支持设备节点的动态创建。devfs提供了在内存中的文件系统中创建设备节点的能力。设备驱动程序能够自主的管理自己的设备文件。而命名节点的任务还是落到了设备驱动程序头上。但是&#xff0c;设备命名策略是可管理的&#xf…

【设计模式】结构型模式·适配器模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一. 概述 将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本接口不兼容而不能一…

分布式搜索引擎--Elasticsearch

1.1 相关术语 和mysql类比 索引&#xff1a;数据库&#xff0c;database&#xff0c;6.0以后变化&#xff0c;对应表 类型&#xff1a;table&#xff0c;6.0以后变化&#xff0c;废弃 文档&#xff1a;一张表里的一行 字段&#xff1a;一个属性就是一个字段 和分布式相关 集群…

NLP学习笔记(六) Transformer简明介绍

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 Transformer\text{Transformer}Transformer&#xff0c;想要获取更多相关文章&#xff0c;欢迎关注 自然语言处理 专栏 在之前的两篇文章中&#xff0c;我们介绍过序列到序列模型以及注意力机制在序列到序列模型中的应用 …

Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!

前言 喜欢折腾慢慢看&#xff0c;不喜欢折腾直接跳到小简下文的一键脚本那里&#xff0c;两分钟搞好。 我的博客&#xff1a;https://blog.ideaopen.cn 我的公众号&#xff1a;小简聊开发 开启远程访问 编辑docker.service文件 vi /usr/lib/systemd/system/docker.service # …

Python FastAPI 框架 操作Mysql数据库 增删改查

2 比 1 更容易理解&#xff0c;可以先看2&#xff08;单文件级别&#xff09; 1、FastAPI 框架 操作Mysql数据库(项目多文件级别) FastAPI 可以使用任何您想要的关系型数据库。 在这里&#xff0c;让我们看一个使用着SQLAlchemy的示例。 您可以很容易地将SQLAlchemy支持任何…

每天进步一点点,今天来学结构体

什么是结构体&#xff1f; C 语言允许用户自己指定这样一种数据结构&#xff0c;它由不同类型的数据组合成一个整体&#xff0c;以便引用&#xff0c;这些组合在一个整体中的数据是互相联系的&#xff0c;这样的数据结构称为结构体&#xff0c;它相当于其它高级语言中记录。 …

01、数据结构——数组

一、数据结构与算法 数据结构是一门研究组织数据方式的学科&#xff0c;有了编程语言也就有了数据结构。学好数据结构可以编写出更加漂亮、更加有效率的代码。程序数据结构算法数据结构是算法的基础 二、稀疏数组&#xff1a; 1、基本介绍&#xff1a; 当一个数组中大部分元…

【Javascript】文本转语音SpeechSynthesisUtterance

SpeechSynthesisUtterance基本介绍 SpeechSynthesisUtterance是HTML5中新增的API,用于将指定文字合成为对应的语音.也包含一些配置项,指定如何去阅读(语言,音量,音调)等 SpeechSynthesisUtterance基本属性 SpeechSynthesisUtterance.lang 获取并设置话语的语言 SpeechSynthesis…

InfluxDB 笔记

概念 Measurement 类似于表名。 A measurement acts as a container for tags, fields, and timestamps. Tag 补充描述数据的信息&#xff0c;如示例中的location和scientist描述了该数据的采集地和采集人。这两个称为Tag Key&#xff0c;具体的值则称为Tag Value&#xff0c…