Leetcode 生命游戏

在这里插入图片描述
以下是上述Java代码的算法思想及其逻辑的中文解释:


算法思想

这段代码实现了LeetCode第289题“生命游戏”的解决方案。核心思想是:

  1. 利用原地修改的方式(in-place)存储下一状态的变化

    • 通过引入额外的状态值(23)来表示细胞的过渡状态。
    • 避免使用额外的存储空间(如创建新矩阵),提高了空间效率。
  2. 两步处理逻辑

    • 第一步:根据当前状态和邻居情况标记下一状态(过渡状态)。
    • 第二步:将过渡状态转换为最终状态。
  3. 状态定义

    • 0:死亡细胞,下一状态仍然死亡。
    • 1:存活细胞,下一状态仍然存活。
    • 2:存活细胞,下一状态变为死亡(过渡状态)。
    • 3:死亡细胞,下一状态变为存活(过渡状态)。

代码逻辑详解

第一步:遍历每个细胞,计算其活邻居数并标记过渡状态
for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {int liveNeighbors = countLiveNeighbors(board, row, col);// 规则 1 和 3:存活细胞由于邻居过少(<2)或过多(>3)而死亡if (board[row][col] == 1 && (liveNeighbors < 2 || liveNeighbors > 3)) {board[row][col] = 2; // 标记为死亡}// 规则 4:死亡细胞由于正好有 3 个活邻居而复活if (board[row][col] == 0 && liveNeighbors == 3) {board[row][col] = 3; // 标记为复活}}
}
  • 遍历二维数组的每个细胞。
  • 调用辅助方法 countLiveNeighbors 来统计当前细胞的活邻居数。
  • 根据规则:
    • 如果当前细胞是存活的(1),但活邻居数少于2或多于3,则变为死亡(2)。
    • 如果当前细胞是死亡的(0),但活邻居数正好为3,则变为存活(3)。

第二步:将过渡状态更新为最终状态
for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {if (board[row][col] == 2) {board[row][col] = 0; // 过渡状态 2 变为死亡} else if (board[row][col] == 3) {board[row][col] = 1; // 过渡状态 3 变为存活}}
}
  • 遍历整个数组,将细胞的过渡状态转化为最终状态:
    • 2 表示的“存活→死亡”变为 0
    • 3 表示的“死亡→存活”变为 1

辅助方法:统计当前细胞的活邻居数量
private int countLiveNeighbors(int[][] board, int row, int col) {int[] directions = {-1, 0, 1};int liveCount = 0;for (int dr : directions) {for (int dc : directions) {if (dr == 0 && dc == 0) continue; // 跳过当前细胞int newRow = row + dr;int newCol = col + dc;// 判断邻居是否在边界范围内,并检查其是否为活细胞if (newRow >= 0 && newRow < board.length && newCol >= 0 && newCol < board[0].length) {if (board[newRow][newCol] == 1 || board[newRow][newCol] == 2) {liveCount++;}}}}return liveCount;
}
  • 通过方向数组 {-1, 0, 1} 遍历当前细胞的8个邻居。
  • 检查邻居是否越界,以及是否是活细胞。
  • 注意:过渡状态 2 仍然被视为活细胞。

复杂度分析

  1. 时间复杂度

    • 遍历矩阵 (O(m \times n)),每个细胞计算8个邻居的活细胞数 (O(1))。
    • 总时间复杂度为 (O(m \times n))。
  2. 空间复杂度

    • 使用原地修改,无需额外存储空间,空间复杂度为 (O(1))。

总结

  • 该算法通过原地修改矩阵,利用额外的状态值来避免使用额外空间。
  • 遵循了题目要求,按规则逐步更新细胞的状态,最终输出下一状态的生命游戏棋盘。
class Solution {public void gameOfLife(int[][] board) {int rows = board.length;int cols = board[0].length;//首先遍历每个细胞,统计其存活邻居数量,并标记过渡状态for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {int liveneighbors = countLiveNeighbors(board, i, j);if((liveneighbors < 2 || liveneighbors > 3) && board[i][j] == 1) {board[i][j] = 2;}if(countLiveNeighbors(board, i, j) == 3 && board[i][j] == 0) {board[i][j] = 3;}}}//根据标记的过渡状态更新boardfor(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {if(board[i][j] == 2) {board[i][j] = 0;}else if(board[i][j] == 3) {board[i][j] = 1;}}}}private int countLiveNeighbors(int[][] board, int row, int col) {int[] directions = {-1, 0, 1};int livecount = 0;for(int dr : directions) {for(int dc : directions) {if(dr == 0 && dc == 0) continue; //跳过原地int newrow = row + dr;int newcol = col + dc;//判断邻居是否越界或存活if(newrow >= 0 && newrow < board.length && newcol >= 0 && newcol < board[0].length) {if(board[newrow][newcol] == 1 || board[newrow][newcol] == 2) {livecount++;}}}}return livecount;}
}

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

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

相关文章

JavaScript 中 arguments、类数组与数组的深入解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是 arguments 对象2.1 arguments 的定义2.2 arguments 的特性2.3 使用场景 &#x1f4af;深入了解 arguments 的结构3.1 arguments 的内部结构arguments 的关键属性 3.2 类数组…

HTTP 协议的作用

HTTP 主要用于在客户端&#xff08;如 Web 浏览器&#xff09;和服务器之间传输超文本&#xff08;如 HTML 文档&#xff09;以及其他类型的数据&#xff08;如图片、视频、文件等&#xff09;。HTTP 协议的主要作用可以概括为如下几点&#xff1a; 信息交换&#xff1a; HTTP…

开源生态发展合作倡议

在信息技术发展的浪潮中&#xff0c;开源已成为全球创新的强劲引擎&#xff0c;深刻影响着各行各业的发展。今天&#xff0c;我们站在新的历史起点上&#xff0c;肩负着推动开源生态发展的重任。在此&#xff0c;开源欧拉&#xff08;openEuler&#xff09;、龙蜥&#xff08;O…

设计模式-创建型-抽象工厂模式

1.概念 工厂方法模式只能生产一个产品系列&#xff0c;抽象工厂可以生产多个产品系列 2.作用 多个具体产品组成一个产品族&#xff08;产品系列&#xff09;&#xff0c;一个具体工厂负责生产一个产品族 3.应用场景 系统所需产品间由依赖关系&#xff0c;可以划分为同一产…

智能合约运行原理

点个关注吧&#xff01;&#xff01; 用一句话来总结&#xff0c;智能合约就像是一个自动售货机&#xff1a;你投入硬币&#xff08;触发条件&#xff09;&#xff0c;选择商品&#xff08;执行合约&#xff09;&#xff0c;然后机器就会自动给你商品&#xff08;执行结果&…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息&#xff1b;requests模块&#xff0c;发生http请求&#xff1b;os模块&#xff0c;文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时&#xff0c;如果不设置User - Agent&#xff0c;默认的…

操作系统基础——针对实习面试

目录 操作系统基础什么是操作系统&#xff1f;简述其主要功能请举例几种不同类型的操作系统&#xff0c;并简要说明它们的特点 操作系统基础 什么是操作系统&#xff1f;简述其主要功能 一、操作系统的定义 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff…

深度学习基础练习:代码复现transformer重难点

2024/11/10-2024/11/18: 主要对transformer一些比较难理解的点做了一些整理&#xff0c;希望对读者有所帮助。 前置知识&#xff1a; 深度学习基础练习&#xff1a;从pytorch API出发复现LSTM与LSTMP-CSDN博客 【神经网络】学习笔记十四——Seq2Seq模型-CSDN博客 【官方双语】一…

ESLint的简单使用(js,ts,vue)

一、ESLint介绍 1.为什么要用ESLint 统一团队编码规范&#xff08;命名&#xff0c;格式等&#xff09; 统一语法 减少git不必要的提交 减少低级错误 在编译时检查语法&#xff0c;而不是等js引擎运行时才检查 2.eslint用法 可以手动下载配置 可以通过vue脚手架创建项…

WPF中DataGrid滚动条自动滚动到文字编辑行的实现方法

文章目录 1.需求分析2. 实现步骤3.完整示例4.总结 在 WPF 中&#xff0c;DataGrid 是一个强大的控件&#xff0c;常常用于显示和编辑数据。有时&#xff0c;我们希望当用户在某一行开始编辑时&#xff0c;DataGrid 自动滚动到该行的位置&#xff0c;确保用户能够看到完整的内容…

算法学习笔记(一):滑动窗口和双指针

滑动窗口套路&#xff1a; 核心套路三步骤&#xff1a; 1.入&#xff1a; 下标为 i 的元素进入窗口&#xff0c;更新相关统计量(因为一个元素进入了&#xff0c;则相关统计的数据要更新&#xff0c;就是)&#xff0c;然后进行判断&#xff0c;如果i < k - 1 则continue&…

探索PDFMiner:Python中的PDF解析利器

文章目录 **探索PDFMiner&#xff1a;Python中的PDF解析利器**1. 背景介绍&#xff1a;为何选择PDFMiner&#xff1f;2. PDFMiner是什么&#xff1f;3. 如何安装PDFMiner&#xff1f;4. 简单库函数使用方法4.1 提取文本4.2 获取页面布局信息4.3 提取表格数据4.4 提取图像 5. 应…

前端开发调试之移动端调试学习笔记

一、引言 随着移动互联网的飞速发展&#xff0c;移动端页面和应用的开发变得越发重要。而在前端开发移动端项目时&#xff0c;有效的调试手段能帮助我们及时发现并解决诸多问题&#xff0c;确保项目在移动端设备上能够正常运行且提供良好的用户体验。以下就是关于前端开发中移动…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js &#xff08;放在项目根目录下&#xff09; module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

LSTM 和 LSTMCell

1. LSTM 和 LSTMCell 的简介 LSTM (Long Short-Term Memory): 一种特殊的 RNN&#xff08;循环神经网络&#xff09;&#xff0c;用于解决普通 RNN 中 梯度消失 或 梯度爆炸 的问题。能够捕获 长期依赖关系&#xff0c;适合处理序列数据&#xff08;如自然语言、时间序列等&…

23种设计模式-模板方法(Template Method)设计模式

文章目录 一.什么是模板方法模式&#xff1f;二.模板方法模式的特点三.模板方法模式的结构四.模板方法模式的应用场景五.模板方法模式的优缺点六.模板方法模式的C实现七.模板方法模式的JAVA实现八.代码解析九.总结 类图&#xff1a; 模板方法设计模式类图 一.什么是模板方法模…

MySQL45讲 第二十五讲 高可用性深度剖析:从主备原理到策略选择

文章目录 MySQL45讲 第二十五讲 高可用性深度剖析&#xff1a;从主备原理到策略选择一、MySQL 主备基础原理&#xff08;一&#xff09;主备关系与数据同步&#xff08;二&#xff09;主备切换流程 二、主备延迟分析&#xff08;一&#xff09;主备延迟的定义与计算&#xff08…

一篇文章了解机器学习(下)

一、决策树 1、主要应用场景为分类的问题。采用“树”的理念&#xff0c;通过计算数据的信息熵确定树的根节点、channel&#xff0c;从而加快数据分类。 注&#xff1a;与常规二分类树的区别&#xff1a;决策树中通过依据树的广度与深度&#xff0c;不断确定根节点的root值&a…

深入解析QP算法及其Python实现

目录 深入解析QP算法及其Python实现第一部分:QP算法的基本原理与数学模型1.1 QP问题定义1.2 算法核心思想1.3 应用场景第二部分:QP算法的Python实现(面向对象设计)2.1 核心代码实现第三部分:案例1 - 投资组合优化问题(策略模式)3.1 问题描述3.2 代码实现3.3 设计模式分析…