算法day31

第一题

542. 01 矩阵

        本题本来求解的是每一个1到0的最短距离并返回到矩阵之中;

        我们采用正难则反的思路,将其化解为每一个0到每一个1的最短距离,并通过矩阵来返回;

解法:多源bfs+正难则反

步骤一:

        定义一个相同大小的dis矩阵,每一个位置都填入-1;

步骤二:

        遍历整个原始矩阵,每一个0点的位置相对应到dis矩阵,并每一个点都填入为0,并将每一个零点都添加到队列

步骤三:

        对于队列中的每一个元素都进行bfs查找,没进行依次查找,dis相对应的位置都加一,直到遍历完所有队列中的元素或者遍历到的所有元素都在边界为止;

使用dis【】【】矩阵的好处:

  1、dist[i][j] = -1 表示当前位置没有被扫描标记
  2、dist[i][j] != -1,表示当前位置里面存在的是当前位置到0的最短距离

至此,代码如下:

class Solution {
    int[] dx = {0,0,1,-1};
    int[] dy = {1,-1,0,0};

    public int[][] updateMatrix(int[][] mat) {
        int m = mat.length,n = mat[0].length;
        //dist[i][j] = -1 表示当前位置没有被扫描标记
        //dist[i][j] != -1,表示当前位置里面存在的是当前位置到0的最短距离
        int[][] dist = new int[m][n];
        for(int i = 0;i < m ;i++){
            for(int j = 0;j< n;j++){
                dist[i][j] = -1;
            }
        }
        Queue<int[]> q = new LinkedList<>();
        //1、把所有的原点加入到队列里面
         for(int i = 0;i < m ;i++){
            for(int j = 0;j< n;j++){
                if(mat[i][j] == 0){
                    dist[i][j] = 0;
                    q.add(new int[]{i,j});
                }
            }
        }
        //2、一层一层的往外扩
        while(!q.isEmpty()){
            int[] t = q.poll();
            int a = t[0],b = t[1];
            for(int i = 0; i<4;i++){
                int x = a + dx[i],y = b +dy[i];
                if(x >= 0 && y >=0 && y<n && x<m && dist[x][y] == -1){
                    dist[x][y] = dist[a][b]+1;
                    q.add(new int[]{x,y});
                }
            }
        }
        return dist;
    }
}

第二题

1020. 飞地的数量

        解法:正难则反+多源bfs

        从矩阵的边界1开始开始进行bfs遍历,对于每一个被遍历到的1进行标记;等边界的所有1bfs遍历完之后,没有被标记的1的个数就是我们所要求解的值;

 至此,代码如下:

class Solution {
    int[] dx = {0,0,1,-1};
    int[] dy = {1,-1,0,0};

    public int numEnclaves(int[][] grid) {
        int m = grid.length,n = grid[0].length;
        boolean[][] vis = new boolean[m][n];
        Queue<int[]> q = new LinkedList<>();
        //1、把边上的1全部加入到队列中
        for(int i = 0;i < m ;i++){
            for(int j = 0;j< n;j++){
                if(i == 0 || i == m-1 || j == 0 || j == n-1){
                    if(grid[i][j] == 1){
                         q.add(new int[]{i,j});
                         vis[i][j] = true;
                    }
                }
            }
        }
        //2、多源bfs
         while(!q.isEmpty()){
            int[] t = q.poll();
            int a = t[0],b = t[1];
            for(int i = 0; i<4;i++){
                int x = a + dx[i],y = b +dy[i];
                if(x >= 0 && y >=0 && y<n && x<m && !vis[x][y] && grid[x][y] ==1 ){
                    vis[x][y] = true;
                    q.add(new int[]{x,y});
                }
            }
        }
        //3、提取结果
        int ret = 0;
         for(int i = 0;i < m ;i++){
            for(int j = 0;j< n;j++){
                if(grid[i][j] == 1 && !vis[i][j]){
                        ret ++;
               }              
            }
        }
        return ret;
    }
}

第三题

1765. 地图中的最高点

解法:正难则反+多源bfs

原矩阵如下:

新定义一个数组,着所有的数值为-1,然后遍历原始矩阵,其1点位置赋值为0;如下:

将每一个0点放入到队列中,并按照出队的顺序对每一个元素进行上下左右的遍历;每一个被遍历的位置都是在最初的位置的值加一,这样一直到遍历完所有的当前非0点,得到新的矩阵;

        第一次bfs遍历:

        第二次bfs遍历:

        

至此,代码如下:

class Solution {
    int[] dx = {0,0,-1,1};
    int[] dy = {1,-1,0,0};
    public int[][] highestPeak(int[][] Water) {
        int m = Water.length,n = Water[0].length;
        int[][] WaterModel = new int[m][n];
        for(int i = 0 ;i< m; i++){
            for(int j = 0 ; j< n ;j++){
                WaterModel[i][j] = -1;
            }
        } 
        Queue<int[]> q = new LinkedList<>();
        //1、处理所有的水域
        for(int i = 0 ;i< m; i++){
            for(int j = 0 ; j< n ;j++){
                if(Water[i][j] == 1){
                    q.add(new int[]{i,j});
                    WaterModel[i][j] = 0;
                }
            }
        } 
        //2\多源bfs
        while(!q.isEmpty()){
            int[] t = q.poll();
            int a = t[0],b = t[1];
            for(int i = 0 ;i < 4 ;i++){
                int x = a + dx[i],y = b + dy[i];
                if(x >= 0 && x < m && y >= 0 && y < n && WaterModel[x][y] == -1){
                    q.add(new int[]{x,y});
                    WaterModel[x][y] = WaterModel[a][b] + 1; 
                }
            } 
        }
        return WaterModel;
    }
}

第四题 

1162. 地图分析

解法:正难则反+多源bfs

本题询问的0到1的最长距离,我们可以转换思路,求解每一个1到0的最长距离;

原始矩阵如下:

定义模拟矩阵,首先都赋值为-1;之前原始矩阵为1的地方赋值为0,并开始根据这些0激进型bfs遍历;

至此,代码如下:

class Solution {    
    int[] dx = {0,0,-1,1};
    int[] dy = {1,-1,0,0};
    public int maxDistance(int[][] grid) {
        int m = grid.length,n = grid[0].length;
        int[][] model = new int[m][n];
        for(int i = 0 ;i< m; i++){
            for(int j = 0 ; j< n ;j++){
                model[i][j] = -1;
            }
        } 
        Queue<int[]> q = new LinkedList<>();
        for(int i = 0 ;i< m; i++){
            for(int j = 0 ; j< n ;j++){
                if(grid[i][j] == 1){
                    q.add(new int[]{i,j});
                    model[i][j] = 0;
                }
            }
        }
        int ret = -1;
            while(!q.isEmpty()){
            int[] t = q.poll();
            int a = t[0],b = t[1];
            for(int i = 0 ;i < 4 ;i++){
                int x = a + dx[i],y = b + dy[i];
                if(x >= 0 && x < m && y >= 0 && y < n && model[x][y] == -1){
                    q.add(new int[]{x,y});
                    model[x][y] = model[a][b] + 1; 
                    ret = Math.max(ret,model[x][y]);
                }
            } 
        }
        return ret;
    }
}

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PDF标准详解(三)—— PDF坐标系统和坐标变换

之前我们了解了PDF文档的基本结构&#xff0c;并且展示了一个简单的hello world。这个hello world 虽然只在页面中显示一个hello world 文字&#xff0c;但是包含的内容却是不少。这次我们仍然以它为切入点&#xff0c;来了解PDF的坐标系统以及坐标变换的相关知识 图形学中二维…

利用Cesium和JS实现地点点聚合功能

引言 在实现基于地图的业务场景时&#xff0c;当地图上需要展示过多的标记点时&#xff0c;大量的分散点会使地图上显得杂乱无章&#xff0c;导致标记点对地图上的其他重要信息造成遮挡和混淆&#xff0c;降低地图整体的可读性。 标记点的聚合就很好的解决了这些痛点的同时&a…

线性规划问题——单纯形算法

第一步&#xff1a;化“约束标准型” 在每个等式约束中至少有一个变量的系数为正&#xff0c;且这个变量只在该约束中出现。在每个约束方程中选择一个这样的变量称为基本变量。 剩下变量称为非基本变量。 一个简单的栗子 上图是一个约束标准型线性规划的例子。 等式1&#x…

几款让你怦然心动的神奇工具——搜嗖工具箱

alteredqualia AlteredQualia 脑洞爆炸器网站&#xff0c;不得不说这是一个神奇的网站&#xff0c;在这个网站上你可以实现不可思议的各种操作&#xff0c;让我们对网站有了新的认知&#xff0c;因为它告诉你不是所有有趣的网站都那么花哨&#xff0c;有些网站看着外形平淡无奇…

AI实践与学习5-AI解题场景RAG应用预研demo

背景 AI解题场景现状&#xff0c;教研测评文档&#xff1a;xxx 解题正确率仍需进一步提高&#xff0c;提示词优化方案基本无力o目前配置的易错题CoT示例支持的长度有限&#xff0c;后续题量大的时候配置具有局限性。某些英语翻译题型BAD CASE反映大模型的输出格式不太符合要求…

设置sqlserver management的字体大小

在用sqlserver management的时候&#xff0c;总感觉怪怪的&#xff0c;然后发现是字体太小的原因。 1&#xff09;设置一下字体&#xff0c;工具--选项&#xff1a; 2&#xff09;环境--字体和颜色--显示其设置&#xff08;环境&#xff09; 3&#xff09;选择微软雅黑&#xf…

在Kubernetes中部署Elasticsearch高可用集群详细教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

btrace:binder_transaction+eBPF+Golang实现通用的Android APP动态行为追踪工具

一、简介&#xff1a; 在进行Android恶意APP检测时&#xff0c;需要进行自动化的行为分析&#xff0c;一般至少包括行为采集和行为分析两个模块。其中&#xff0c;行为分析有基于规则、基于机器学习、基于深度学习甚至基于大模型的方案&#xff0c;各有各的优缺点&#xff0c;不…

Photoshop中颜色与色调的调整

Photoshop中颜色与色调的调整 Photoshop中的颜色模式RGB模式灰度模式位图模式索引模式CMYK模式Lab模式 Photoshop中的颜色/色调调整命令颜色/色调调整命令的分类亮度/对比度调整命令色阶命令曲线命令曝光度命令自然饱和度命令色相/饱和度命令色彩平衡命令照片滤镜调整命令通道混…

一篇文章教你学会公众号IP写作(新手小白必备)

最近在带大家玩公众号 IP 写作&#xff0c;很多新手小白常问的问题&#xff0c; 1 什么是IP写作&#xff1f; “IP写作&#xff0c;简单来说&#xff0c;就是通过在公众号上持续写出有价值的文章&#xff0c;来建立个人影响力。 让读者了解你、信任你、找你付费。实现高价值、强…

MySQL之优化服务器设置(二)

优化服务器设置 InnoDB事务日志(包含:Redo log 重做日志和Undo log回滚日志) 了解清楚"把日志缓冲写到日中文件"和"把日志刷新到持久化存储"之间的不同是很重要的。在大部分操作系统中&#xff0c;把缓冲写到日志只是简单地把数据从InnoDB的内存缓冲转移…

MySQL中的正排/倒排索引和DoubleWriteBuffer

正排/倒排索引 正排索引 文档1&#xff1a;词条A&#xff0c;词条B&#xff0c;词条C 文档2&#xff1a;词条A&#xff0c;词条D 文档3&#xff1a;词条B&#xff0c;词条C&#xff0c;词条E正排表是以文档的ID为关键字&#xff0c;表中记录文档中的每个字的位置信息&#xff…

人事信息管理系统(Java+MySQL)

一、项目背景 在现代企业中&#xff0c;管理大量员工的工作信息、薪资、请假、离职等事务是一项非常繁琐和复杂的任务。传统的手工管理方式不仅效率低下&#xff0c;而且容易出错。为了提高人事管理的效率&#xff0c;减少人工操作带来的错误&#xff0c;企业迫切需要一个高效…

怎样收集企业名单?

收集企业名单的方法按照不同维度有不同的方式&#xff0c; 通过人工一个个收集&#xff0c;通过技术手段收集&#xff0c;通过第三方进行购买。 按照来源渠道&#xff0c;可以分为官方和非官方网站&#xff0c;官方的有公示系统&#xff0c;年报等。此外一些相对于官方的平台…

论文阅读笔记:DepGraph: Towards Any Structural Pruning

论文阅读笔记&#xff1a;DepGraph: Towards Any Structural Pruning 1 背景2 创新点3 方法4 模块4.1 分组4.2 依赖图4.3 网络分解4.4 依赖建模4.4 组级剪枝 5 效果 论文&#xff1a;https://arxiv.org/pdf/2301.12900 代码&#xff1a;https://github.com/VainF/Torch-Prunin…

Anaconda环境安装失败的解决方案

链接步骤的补充。 为了运行marlib&#xff0c;需要一个全新的Anaconda环境。但是&#xff0c;不想把文件安装在C盘&#xff0c;会造成空间不足。于是试着在.condarc文件里面改动了路径&#xff0c;具体如图。 上图中&#xff0c;在defaults前面添加了D盘的路径作为安装路径。 …

docker环境中配置phpstorm php xdebug调试工具

本文介绍通过docker compose的使用方式 第一步&#xff1a;在php镜像中安装phpxdebug扩展&#xff0c;比如php7.4对应的是xdebug3.1.6 第二步&#xff1a;设置项目中的docker-compose.yml docker-compose 增加开启xdebug的环境变量,host.docker.internal是宿主机的地址&#…

错题记录(小测)

单选 错题1 错题2 错题3 代码题 反转链表 链表的回文结构

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用&#xff0c;让我们的编程更加靠近人类思维&#xff0c;当多个类存在相同的属性&#xff08;变量&#xff09;和方法时&#xff0c;可以从这些类中抽象出父类&#xff0c;在父类中定义这些相同的属性和方法&#xff0c;所有的子…

利用flask + pymysql监测数据同步中的数据是否完整

一、背景 最近项目搞重构&#xff0c;将原有的系统拆分成了多个子系统。但是有数据表需要在不同系统中数据&#xff0c;同时为了解决项目性能最了一个很简单的方案&#xff0c;就是公共数据存在每个系统之中。 二、分析 分析这些表&#xff0c;这些表相比源数据表&#xff0c;表…