leetcode 542. 01 矩阵

news2024/11/15 18:03:04

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。

示例 1:
输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

示例 2:
输入:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]

提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 104
1 <= m * n <= 104
mat[i][j] is either 0 or 1.
mat 中至少有一个 0

思路:
可以采用广度遍历的方式来做,先把所有为 0 的元素进队列,然后依次计算出其临近的元素的距离,依次直到把矩阵中所有的元素的距离都计算完。

class Solution:
    def __init__(self):
        self.INT_MAX = 100000

    def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:
        rows, cols = len(mat), len(mat[0])
        res = [[self.INT_MAX for j in range(cols)] for i in range(rows)]
        visited = [[0 for j in range(cols)] for i in range(rows)]
        ss = []
        for i in range(rows):
            for j in range(cols):
                if mat[i][j] == 0:
                    res[i][j] = 0
                    visited[i][j] = 1
                    ss.append((i, j))
        while len(ss) > 0:
            r, c = ss.pop(0)
            if r>0 and visited[r-1][c] == 0:
                ss.append((r-1, c))
                visited[r-1][c] = 1
                res[r-1][c] = min(res[r-1][c], res[r][c]+1)
            if r+1<rows and visited[r+1][c] == 0:
                ss.append((r+1, c))
                visited[r+1][c] = 1
                res[r+1][c] = min(res[r+1][c], res[r][c]+1)
            if c>0 and visited[r][c-1] == 0:
                ss.append((r, c-1))
                visited[r][c-1] = 1
                res[r][c-1] = min(res[r][c-1], res[r][c]+1)
            if c+1<cols and visited[r][c+1] == 0:
                ss.append((r, c+1))
                visited[r][c+1] = 1
                res[r][c+1] = min(res[r][c+1], res[r][c]+1)
        return res

方法二,采用动态规划来做
在这里插入图片描述

class Solution:
    def __init__(self):
        self.INT_MAX = 100000

    def updateMatrix(self, mat: List[List[int]]) -> List[List[int]]:
        rows, cols = len(mat), len(mat[0])
        res = [[self.INT_MAX for j in range(cols)] for i in range(rows)]
        visited = [[0 for j in range(cols)] for i in range(rows)]
        ss = []
        for i in range(rows):
            for j in range(cols):
                if mat[i][j] == 0:
                    res[i][j] = 0
        ### from 左上
        for i in range(rows):
            for j in range(cols):
                if i-1>=0:
                    res[i][j] = min(res[i-1][j]+1, res[i][j])
                if j-1>=0:
                    res[i][j] = min(res[i][j-1]+1, res[i][j])
        ### from 右上
        for i in range(rows):
            for j in range(cols-1, -1, -1):
                if i-1>=0:
                    res[i][j] = min(res[i-1][j]+1, res[i][j])
                if j+1<cols:
                    res[i][j] = min(res[i][j+1]+1, res[i][j])
        
        ## from 左下
        for i in range(rows-1, -1, -1):
            for j in range(cols):
                if i+1<rows:
                    res[i][j] = min(res[i+1][j]+1, res[i][j])
                if j-1>=0:
                    res[i][j] = min(res[i][j-1]+1, res[i][j]) 
        
        ## from 右下
        for i in range(rows-1, -1, -1):
            for j in range(cols-1, -1, -1):
                if i+1<rows:
                    res[i][j] = min(res[i+1][j]+1, res[i][j])
                if j+1<cols:
                    res[i][j] = min(res[i][j+1]+1, res[i][j])
        return res

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

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

相关文章

TaskExecutor和ExecutorService的简单整合

文章目录 一、遇到问题二、达成目的三、开始调研1、使用Async获取线程池流程2、查看中间件线程池工具类3、观察AsyncConfigurer接口4、查看TaskExecutorAdapter源码 四、复盘总结 一、遇到问题 自己负责的项目想通过引入一个中间件&#xff0c;达到在业务场景维度的全链路日志…

【【51单片机的蜂鸣器-11】】

51单片机的蜂鸣器 DS1302我一直有问题搁置了几百天了 先来看看蜂鸣器 搞了一个礼拜verilog然后出去吃饭 估计自己得有10多天没看c语言和51单片机了 现在先处理一下蜂鸣器的问题 蜂鸣器 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 有源内部自带震荡源&#xff0c;将正负极接上直流电压…

类之间的关系

1. 关系强弱顺序&#xff08;由强到弱&#xff09; 泛化实现组合聚合关联依赖 图中&#xff0c;组合和聚合标错了 2. 依赖 虚线箭头&#xff0c;箭头指向被依赖类依赖关系描述了两个类之间的临时关系。通常不会持续整个对象的生命周期&#xff0c;而是创建一个临时的关系以满…

string【1】介绍与使用(超详解哦)

string的介绍与使用 引言string类常用接口构造函数容量操作size与lengthcapacityresizereserveclearempty 元素访问迭代器访问beginendrbeginrend范围for 下标访问 字符串修改insertappendpush_backoperatorpop_backerase 字符串查找findrfind 非成员函数operator>>opera…

光场成像2.0——聚焦型光场相机

光场2.0 1. 发展历程 由于光场1.0从结构上子图像的分辨率严重依赖MLA子透镜的数量&#xff0c;因此分辨率一直受限&#xff0c;限制了光场1.0结构的广泛应用。针对此不足&#xff0c;在2008年&#xff0c;又一篇伟大的论文出现了&#xff0c;该论文提出了全分辨率光场渲染的概…

CS拒绝连接,Cobalt Strike连接失败,Cobalt Strike使用方法(一)

拒绝连接 connection refused:connect。 kali端&#xff08;服务器端&#xff09;和本地端win10。看看端口开启状态 先启动服务器端 查看端口开启状态&#xff0c;确定50050端口开启&#xff0c;可以参阅本文章点击跳转 没问题再往下看。 使用步骤 chmod 777 ./teamserver…

【运维工程师学习】Centos中MySQL替换MariaDB

【运维工程师学习】Centos8中MySQL替换MariaDB 1、查看已有的mysql2、MySQL官网tar包下载3、找到下载路径解压4、移动解压后的文件夹到/usr/local/mysql5、创建data文件夹&#xff0c;一般用于存放数据库文件数据6、创建用户组7、更改用户文件夹权限8、生成my.cnf文件9、编辑my…

排序子序列,倒置字符串讲解(图文并茂)

目录 1.排序子序列 2.倒置字符串 1.排序子序列 排序子序列_牛客笔试题_牛客网 (nowcoder.com) 首先题干中提到非递增序列和非递减序列&#xff0c;那么我们就要先弄明白什么是上述2种序列&#xff1a; 非递增序列&#xff1a;a[i] > a[i1] 如&#xff1a;3 2 1 或者 3 3 …

运动控制-达妙C#开源USB2CAN例程

C# Can总线资料不多, 达妙USB2CAN入口 http://www.dmbot.cn/forum.php?modviewthread&tid328&extrapage%3D1

怎么自学网络安全?遇到问题该怎么解决?

趁着今天下班&#xff0c;我花了几个小时整理了下&#xff0c;非常不易&#xff0c;希望大家可以点赞收藏支持一波&#xff0c;谢谢。 我的经历&#xff1a; 我 19 年毕业&#xff0c;大学专业是物联网工程&#xff0c;我相信很多人在象牙塔里都很迷茫&#xff0c;到了大三大…

帝国cms如何判断首页高亮显示

通过简单的代码判断当前页面是否为首页并且进行高亮的代码如下&#xff1a; 判断逻辑是获取当前栏目id&#xff0c;如果为空则为首页。 条件判断代码&#xff1a; <?php if(empty($GLOBALS[navclassid])){echo class"active";}?> 需要特别说明的此判断会…

二进制文件的Python写入与读取

二进制文件的Python编写 这么基础的东西&#xff0c;必然用内置的就好 二进制文件的Python读写 重要提示 p.s. 1 >>> bHello World.decode() "Hello World" True >>> example import struct with open(binary_file.bin, wb) as file:data b…

【华为机试】HJ17 坐标移动详解+完整源代码示例

忙碌了一周&#xff0c;一直没时间更新&#xff0c;趁着周末来更新第二个题目。 题目 题目解析 这个题目相比于上一个题目来说&#xff0c;会简单一些&#xff0c;不涉及到那些复杂的算法&#xff0c;就是对于字符串的处理。 算法步骤 输入一个字符串根据分号&#xff0c;将…

uniapp 集成七牛云,上传图片

1 创建项目 我是可视化创建项目的 &#xff0c;cli创建的项目可以直接使用npm安装七牛云。 2 拷贝qiniuUploader.js到项目&#xff0c;下面的回复 放了qiniuUploader.js百度云链接。 3 在需要使用qiniuUploader的vue文件 引入。 4 相册选择照片&#xff0c;或者拍照后&#xff…

Redis-持久化、主从集群、哨兵模式、分片集群、分布式缓存

文章目录 高级篇 - 分布式缓存 Redis集群0、单节点Redis的问题一、Redis持久化1.1 RDB 持久化1.1.1 基本介绍1.1.2 RDB的fork原理1.2.3 总结 1.2 AOF持久化1.3 RDB与AOF对比 二、Redis主从集群2.1 介绍2.2 搭建主从集群2.2.1 准备实例、配置2.2.2 启动2.2.3 开启主从关系2.2.4 …

快速而简单的视频格式转换方法

在数字时代&#xff0c;我们经常需要将视频文件从一种格式转换为另一种格式。无论是因为兼容性问题&#xff0c;还是为了在特定设备上播放视频&#xff0c;视频格式转换是一项非常常见的任务。本文将介绍视频格式转换的基本知识和步骤。 首先&#xff0c;了解不同的视频格式非常…

8.3 非正弦波发生电路

在实用电路中除了常见的正弦波外&#xff0c;还有矩形波、三角波、锯齿波、尖顶波和阶梯波&#xff0c;如图8.3.1所示。 一、矩形波发生电路 矩形波发生电路是其它非正弦波发生电路的基础&#xff0c;例如&#xff0c;若方波电压加在积分运算电路的输入端&#xff0c;则输出就…

数学建模-相关系数

excel基本操作&#xff1a;ctrl右&#xff0c;ctrl左&#xff0c;ctrlshift下/右&#xff0c;ctrlshift空格 题目里有数据&#xff0c;给出描述性统计是比较好的习惯 excel描述性统计&#xff1a;数据-数据分析-描述统计 MATLAB要做散点图C62个 SPSS可以直接画出两两之间的散…

华为OD机试真题 Java 实现【最小循环子数组】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、备注五、Java算法源码六、效果展示1、输入2、输出 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有…

koa初体验———swagger使用

学习完koa框架和mysql&#xff0c;写了一个小demo&#xff0c;选课管理系统&#xff0c;其中包含权限验证&#xff0c;登录注册&#xff0c;用户管理和选课管理。写这个项目目的一方面是为了自己练手&#xff0c;另一方面是为了我们在学习新技术的时候能够有接口供我们使用去测…