leetcode 289.生命游戏

news2024/11/20 8:39:34

思路:二维前缀和

其实这道题和昨天的每日一题661.图片平滑器是一样的思路。

既然是周围的八个位置都需要考虑,我们就会想到用二维前缀和的加减法来实现,你也可以用模拟暴力实现,但是这样的话,我们需要讨论很多种情况,比如行为1的时候,列为1的时候,这个时候就需要处理很多的边界问题,所以我们选择用前缀和解决这个问题。

首先可以参考一下661.图片平滑器的模拟做法,时间复杂度是挺好的,但是就是在处理边界,以及特殊情况的时候,我们会感到极其的麻烦。

class Solution {
    public int[][] imageSmoother(int[][] img) {
        int res[][]=new int[img.length][img[0].length];
        if(img.length==1&&img[0].length==1){
            res[0][0]=img[0][0];
            return res;
        }
        if(img.length==1&&img[0].length!=1){
            for(int i=0;i<img[0].length;i++){
                if(i==0){
                int target=(img[0][i]+img[0][i+1])/2;
                res[0][0]=target;
                }
                else if(i==img[0].length-1){
                    int target=(img[0][i]+img[0][i-1])/2;
                    res[0][img[0].length-1]=target;
                }
                else{
                    int target=(img[0][i]+img[0][i-1]+img[0][i+1])/3;
                    res[0][i]=target;
                }
            }
            return res;
        }
        if(img.length!=1&&img[0].length==1){
            for(int i=0;i<img.length;i++){
                if(i==0){
                    int target=(img[i][0]+img[i+1][0])/2;
                    res[0][0]=target;
                }
                else if(i==img.length-1){
                    int target=(img[i][0]+img[i-1][0])/2;
                    res[img.length-1][0]=target;
                }
                else{
                    int target=(img[i][0]+img[i-1][0]+img[i+1][0])/3;
                    res[i][0]=target;
                }
            }
            return res;
        }
        int m=img.length;
        int n=img[0].length;
        for(int i=0;i<img.length;i++){
            if(i==0){
                int av1=(img[0][0]+img[1][0]+img[0][1]+img[1][1])/4;
                int av2=(img[0][img[0].length-1]+img[0][img[0].length-2]+img[1][img[0].length-1]+img[1][img[0].length-2])/4;
                res[0][0]=av1;
                res[0][img[0].length-1]=av2;
            }
            else if(i==img.length-1){
                int av1=(img[i][0]+img[i][1]+img[i-1][0]+img[i-1][1])/4;
                int av2=(img[i][img[0].length-1]+img[i][img[0].length-2]+img[i-1][img[0].length-1]+img[i-1][img[0].length-2])/4;
                res[i][0]=av1;
                res[i][img[0].length-1]=av2;
            }
            else{
                int target=(img[i][0]+img[i][1]+img[i-1][0]+img[i-1][1]+img[i+1][0]+img[i+1][1])/6;
                int target2=(img[i][n-1]+img[i][n-2]+img[i-1][n-1]+img[i-1][n-2]+img[i+1][n-1]+img[i+1][n-2])/6;
                res[i][0]=target;
                res[i][n-1]=target2;
            }
        }
        for(int j=1;j<img[0].length-1;j++){
            int target1=(img[0][j]+img[0][j-1]+img[0][j+1]+img[1][j+1]+img[1][j]+img[1][j-1])/6;
            int target2=(img[m-1][j]+img[m-1][j+1]+img[m-1][j-1]+img[m-2][j+1]+img[m-2][j]+img[m-2][j-1])/6;
            res[0][j]=target1;
            res[m-1][j]=target2;
        }
        for(int i=1;i<img.length-1;i++){
            for(int j=1;j<img[0].length-1;j++){
                int target=(img[i][j]+img[i][j+1]+img[i][j-1]+img[i+1][j]+img[i+1][j-1]+img[i+1][j+1]+img[i-1][j]+img[i-1][j-1]+img[i-1][j+1])/9;
                res[i][j]=target;
            }
        }
        return res;
    }
}

回到本题,接下来就是介绍前缀和的做法:

比如我们在(i,j)这个坐标上,我们的周围八个位置把我们包围成一个3x3的矩阵,其实说实话,就是右下角的坐标以及左上角的坐标包含的一个区域罢了。看到这里,我们可以想到,这里用前缀和其实是划算的,我们直接求出右下角的前缀和,然后再减去两边的前缀和,加上减去的多余的前缀和,最后再减去自身的值,这样的话,我们就求出来了这个坐标周围的细胞总和是多少,然后按照题目要求直接判断就行了。

对了,因为可能会有边界问题,我们在进行计算的时候对边界的坐标进行了处理,以防止数组越界。

关于二维前缀和,可以去百度一下,知乎,csdn都有详细的介绍。

class Solution {
    public void gameOfLife(int[][] board) {
        int m=board.length;
        int n=board[0].length;
        int res[][]=new int[m][n];
        int [][]sum=new int[m+1][n+1];
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+board[i-1][j-1];
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int x1=Math.min(m-1,i+1);
                int y1=Math.min(n-1,j+1);
                int x2=Math.max(0,i-1);
                int y2=Math.max(0,j-1);
                int t=sum[x1+1][y1+1]-sum[x1+1][y2]-sum[x2][y1+1]+sum[x2][y2]-board[i][j];
                if(board[i][j]==0){
                    if(t==3){
                        res[i][j]=1;
                    }
                }
                else{
                    if(t<2){
                        res[i][j]=0;
                    }
                    else if(t==2||t==3){
                        res[i][j]=1;
                    }
                    else if(t>3){
                        res[i][j]=0;
                    }
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                board[i][j]=res[i][j];
            }
        }
    }
}

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

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

相关文章

实验十三 生态安全评价

1 背景及目的 生态安全是生态系统完整性和健康性的整体反映&#xff0c;完整健康的生态系统具有调节气候净化污染、涵养水源、保持水土、防风固沙、减轻灾害、保护生物多样性等功能。维护生态安全对于人类生产、生活、健康及可持续发展至关重要。随着城市化进程的不断推进&…

怎样实现跨部门和跨地区的数据共享?

随着企业规模的扩大和业务的多样化&#xff0c;不同部门和地区之间的数据共享变得越来越重要。实时数据同步作为保证数据准确性和完整性的重要手段&#xff0c;被广泛应用于各行各业。那不同部门和不同地区怎么实现共享数据呢&#xff1f; 一、前期数据准备 前期数据上需要建…

国家工信安全中心:公共数据授权运营平台技术要求(附下载)

2023年11月23日&#xff0c;第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开&#xff0c;国家数据局党组书记、局长刘烈宏&#xff0c;浙江省委常委、常务副省长徐文光出席会议并致辞。会上&#xff0c;国家工业信息安全发展研究中心&#xff08;以下简称…

C语言数据结构——详细讲解 双链表

从单链表到双链表&#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作&#xff08;一&#xff09;双链表的尾插操作&#xff08;二&a…

【ArcGISPro】地理配准-影像校正

由于大部分数据安全性&#xff0c;以下是随意下载的图片&#xff0c;仅展示配置操作 地图-地理配准 添加控制点 修改控制点 可以导入、导出、添加和删除控制点 保存 关闭地理配准

ReNamer Pro 7.5 中文绿色便携专业版-文件重命名工具

前言 我们日常生活和工作中所涉及的文件数量日益增多。无论是图片、音频、视频还是各种文档&#xff0c;这些文件在存储、管理和分享时&#xff0c;都需要有一个清晰、有序的文件命名规则。然而&#xff0c;手动重命名大量文件不仅耗时耗力&#xff0c;而且容易出错&#xff0c…

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写&#xff0c;也就是说程序在执行的时候生成可以执行的代码&#xff0c;然后执行它。在介绍JIT之前&#xff0c;需要说下两种执行方式&#xff1a;解释执行和编译执行。其中解释执行是通过解释器&#xff0c;将代码逐…

力扣-Hot100-数组【算法学习day.37】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

DataStream编程模型之数据源、数据转换、数据输出

Flink之DataStream数据源、数据转换、数据输出&#xff08;scala&#xff09; 0.前言–数据源 在进行数据转换之前&#xff0c;需要进行数据读取。 数据读取分为4大部分&#xff1a; &#xff08;1&#xff09;内置数据源&#xff1b; 又分为文件数据源&#xff1b; socket…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

vue2侧边导航栏路由

<template><div><!-- :default-active"$route.path" 和index对应其路径 --><el-menu:default-active"active"class"el-menu-vertical-demo"background-color"#545c64"text-color"#fff"active-text-col…

时代变迁对传统机器人等方向课程的巨大撕裂

2020年之后&#xff0c;全面转型新质课程规划&#xff0c;传统课程规划全部转为经验。 农耕-代表性生产关系-封建分配制度主要生产力-人力工业-代表性生产关系-资本分配制度工业分为机械时代&#xff0c;电气时代&#xff0c;信息时代&#xff1b;主要生产力-人力转为人脑&…

JVM类加载过程-Loading

一、Class对象的生命周期 .class文件是如何加载到内存中:.class文件是ClassLoader通过IO将文件读到内存,再通过双亲委派的模式进行Loading,再Linking、以及Initializing,代码调用等一系列操作后,进行GC,组成完整的生命周期; 二、双亲委派模式(Loading的过程): 1、类…

BERT--公认的里程碑

前言 如果说&#xff0c;让我选Transformer架构的哪个模型最深入人心&#xff0c;我将毫不犹豫的选择BERT&#xff01; BERT 的意义在于&#xff0c;从大量无标记的数据集中训练得到的深度模型&#xff0c;可以限制提高各项自然语言处理任务的准确率。 BERT 在当时&#xff0…

<项目代码>YOLOv8 瞳孔识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…

果韵 2.0.1| 听歌神器,双端支持,支持下载歌曲和歌词

果韵是一款支持Windows和安卓双端的音乐播放器&#xff0c;支持自定义音源&#xff0c;界面简洁。用户可以通过缓存下载歌曲和歌词。为了使用这些功能&#xff0c;需要先进行音源导入。通过设置中的存储设置&#xff0c;将缓存文件夹移动到download目录下&#xff0c;之后缓存的…

Allegro从.brd文件中导出器件ball map

Step 1&#xff08;可选&#xff09;&#xff1a;设置网络颜色 Step2&#xff1a;File->Export->Symbol Spreadsheet\ Step3&#xff1a;Primary text选择Net Name Step 4&#xff1a;在.brd所有文件夹下生成一个ball map文件&#xff0c;其中网络颜色与Step 1一致。ba…

Docker入门之Windows安装Docker初体验

在之前我们认识了docker的容器&#xff0c;了解了docker的相关概念&#xff1a;镜像&#xff0c;容器&#xff0c;仓库&#xff1a;面试官让你介绍一下docker&#xff0c;别再说不知道了 之后又带大家动手体验了一下docker从零开始玩转 Docker&#xff1a;一站式入门指南&#…

家庭网络常识:猫与路由器

这张图大家应该不陌生——以前家庭网络的连接方式。 图1 家庭网络连接示意图 来说说猫/光猫&#xff1a; 先看看两者的图片。 图2 猫 图3 光猫 这个东西因为英文叫“modem”&#xff0c;类似中文的“猫”&#xff0c;所以简称“猫”。 猫和光猫的区别就是&#xff0c;一…