算法day31

news2025/4/6 8:28:33

第一题

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:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

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

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

相关文章

僵尸网络相关

个人电脑被植入木马之后&#xff0c;就会主动的连接被黑客控制的这个C&C服务器&#xff0c;然后这个服务器就会给被植入木马的这个电脑发指令&#xff0c;让他探测在他的局域网内还有没有其他的电脑了&#xff0c;如果有那么就继续感染同局域网的其他病毒&#xff0c;黑客就…

基于单片机的无人监守点滴控制系统设计

摘要 &#xff1a; 在当代社会 &#xff0c; 点滴是一种常用的诊疗方法 。 为了减轻医护人员的压力 &#xff0c; 设计了一种基于单片机的无人监守点滴控制系统&#xff0c; 该系统共由 2 个板子组成 &#xff0c; 其中一个主控板子 &#xff0c; 一个检测板子 。 检测板与…

maven编译【-Dmaven.test.skip=true和-DskipTests=true的区别】

1、背景 我在执行maven编译时&#xff0c;遇到下面情况&#xff1a; 1、当执行命令为下面&#xff1a; mvn clean compile package install -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue -Dra…

救命!挖到宝了,这本计算机书真的巨巨好看

一本适合大学生使用的计算机科学和编程学习指南&#xff0c;它通过丰富的内容和多样的学习形式&#xff0c;帮助学生建立坚实的计算机科学基础&#xff0c;并激发他们对计算机科学的兴趣。 这本书涵盖了多种类型的练习题&#xff0c;旨在帮助读者巩固理论知识并提高实际编程技能…

PostgreSQL下载地址

下载地址&#xff1a;PostgreSQL: File Browser

深入理解ReentrantLock

深入理解ReentrantLock 在Java并发编程中&#xff0c;锁&#xff08;Lock&#xff09;是控制多个线程对共享资源访问的重要工具。虽然Synchronized关键字是实现锁的常用方式&#xff0c;但它在功能上比较有限。ReentrantLock是java.util.concurrent.locks包中提供的一个更加灵…

Python基础教程(十九):网络编程

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

【吊打面试官系列-Mysql面试题】实践中如何优化 MySQL?

大家好&#xff0c;我是锋哥。今天分享关于 【实践中如何优化 MySQL&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 实践中如何优化 MySQL&#xff1f; 最好是按照以下顺序优化&#xff1a; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1、SQL 语…

组件化框架 ARouter 完全解析(一)

一、路由认知 ARouter从命名即可知&#xff0c;这是一个路由框架。那么路由是个啥呢&#xff1f; 路由&#xff08;routing&#xff09;就是通过互联的网络把信息从源地址传输到目的地址的活动。-- 百科 可见 路由 是个动词&#xff0c;这是网络传输中的概念&#xff0c;完成路…

跨境电商测评、采购大额下单自养号需要解决哪些技术原理?

市场上有许多伪装工具&#xff0c;但大多数只是为了方便开发人员测试系统程序&#xff0c;它们并不能针对特定的电商平台进行伪装。每个电商平台都有其独特的风控机制&#xff0c;因此&#xff0c;我们需要从硬件环境的底层配合软件控制&#xff0c;以满足各平台的检测规则。 …

Spring boot 使用AbstractRoutingDataSource实现数据源动态切换

目录 一、AbstractRoutingDataSource 二、具体实现 1、pom.xml 2、新建UserMapper 3、在spring boot 启动类上添加扫描mapper注解 4、在配置文件 application.properties 中添加多个(我这里是两个)数据源的配置信息 5、集成动态数据源模块 5.1、新建注解 CurDataSource…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】梯度的反向传播算法

矩阵微积分&#xff08;Matrix Calculus&#xff09; 在开始之前&#xff0c;需要先了解矩阵微积分的一些计算规则。 首先&#xff0c;对于矩阵微积分的表示&#xff0c;通常由两种符号约定&#xff1a; 分母布局 标量关于向量的导数为列向量 向量关于标量的导数为行向量 N维…

C# Winform Datagridview查询项目实例

在项目中&#xff0c;我们经常要遇到查询和展示内容&#xff0c;常用的做法是通过文本框&#xff0c;时间控件&#xff0c;按键和datagridview查询和展示内容。下面是一个常见的综合实例&#xff0c;并支持Excel(csv)导入导出&#xff0c;表格列动态调整的功能。 实例代码链接&…

【python-AI篇】人工智能技能树思维导图

大致总结一下得出如下思维导图&#xff0c;如不完善日后迭代更新 1. python基础三方库 1.1 科学计算库 ---- numpy库 1.2 科学计算库 ---- Scipy库 1.3 数据分析处理库 ---- pandas库 1.4 可视化库 ---- matplotlib库 1.5 可视化库 ---- seaborn库 1.6 机器学习和数据挖掘库 …

springboot网上书店管理系统-计算机毕业设计源码03780

摘 要 网上书店管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、站点管理&#xff08;轮播图&#xff09;用户管理&#xff08;管理员、注册用户&#xff09;内容管理&#x…

OpenCV 4.10 发布

OpenCV 4.10 JPEG 解码速度提升 77%&#xff0c;实验性支持 Wayland、Win ARM64 根据 “OpenCV 中国团队” 介绍&#xff0c;从 4.10 开始 OpenCV 对 JPEG 图像的读取和解码有了 77% 的速度提升&#xff0c;超过了 scikit-image、imageio、pillow。 4.10 版本的一些亮点&…

第N4周:中文文本分类-Pytorch实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 一、准备工作 1.任务说明 文本分类流程图&#xff1a; 2.加载数据 ​编辑 二、…

第2章 Rust初体验7/8:错误处理时不关心具体错误类型的下划线:提高代码可读性:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6.6 用as进行类型转换:显式而简洁的语法 贾克强:“大家在查看Rust代码时,可能会注意到这一句。在这里,如果我们不使用as i32,编译器会报错,因为它在u32中找不到abs()方法。这是因为prev和sum_of_two_dice都是u32类型,u32类型并不支持abs(…

【LLM】吴恩达『微调大模型』课程完全笔记

Finetuning Large Language Models 版权说明&#xff1a; 『Finetuning Large Language Models』是DeepLearning.AI出品的免费课程&#xff0c;版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理&#xff0c;只作为教育用途&#xff0c;不…

4-字符串-11-反转字符串-LeetCode344

4-字符串-11-反转字符串-LeetCode344 LeetCode: 题目序号344 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff0…