当前位置: 首页 > news >正文

【优选算法】(第四十五篇)

目录

地图分析(medium)

题目解析

讲解算法原理

编写代码

课程表(medium)

题目解析

讲解算法原理

编写代码


地图分析(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

你现在⼿⾥有⼀份⼤⼩为 n x n 的⽹格 grid ,上⾯的每个单元格都⽤ 0 和 1 标记好了。其中 0 代表海洋, 1 代表陆地。
请你找出⼀个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最⼤的,并返回该距离。如果⽹格上只有陆地或者海洋,请返回 -1 。
我们这⾥说的距离是「曼哈顿距离」(ManhattanDistance): (x0, y0) 和 (x1, y1) 这两个单元格之间的距离是 |x0 - x1| + |y0 - y1| 。

⽰例1:


输⼊:grid=[[1,0,1],[0,0,0],[1,0,1]]
输出:2
解释:
海洋单元格(1,1)和所有陆地单元格之间的距离都达到最⼤,最⼤距离为2。
⽰例2:


输⼊:grid=[[1,0,0],[0,0,0],[0,0,0]]
输出:4
解释:
海洋单元格(2,2)和所有陆地单元格之间的距离都达到最⼤,最⼤距离为4。
提⽰:
◦ n == grid.length
◦ n == grid[i].length
◦ 1 <= n <= 100
◦ grid[i][j] 不是 0 就是 1

讲解算法原理

解法:
算法思路:

01矩阵的变型题,直接⽤多源bfs解决即可。

编写代码

c++算法代码:

class Solution
{int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};
public:int maxDistance(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<int>> dist(m, vector<int>(n, -1));queue<pair<int, int>> q;for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)if(grid[i][j]){dist[i][j] = 0;q.push({i, j});}int ret = -1;while(q.size()){auto [a, b] = q.front(); q.pop();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 && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.push({x, y});ret = max(ret, dist[x][y]);}}}return ret;}
};

java算法代码:

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[][] 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<>();for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)if(grid[i][j] == 1){dist[i][j] = 0;q.add(new int[]{i, j});}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 && dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;q.add(new int[]{x, y});ret = Math.max(ret, dist[x][y]);}}}return ret;}
}

课程表(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

你这个学期必须选修 numCourses ⻔课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要⼀些先修课程。先修课程按数组 prerequisites 给出,其中
prerequisites[i] = [a(i), b(i)] ,表⽰如果要学习课程 a(i) 则必须先学习课程
b(i) ()。
◦ 例如,先修课程对 [0, 1] 表⽰:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
⽰例1:
输⼊:numCourses=2,prerequisites=[[1,0]]
输出:true
解释:总共有2⻔课程。学习课程1之前,你需要完成课程0。这是可能的。
⽰例2:
输⼊:numCourses=2,prerequisites=[[1,0],[0,1]]
输出:false
解释:总共有2⻔课程。学习课程1之前,你需要先完成课程0;并且学习课程0之前,你还应先完成课程1。这是不可能的。

提⽰:
◦ 1 <= numCourses <= 2000
◦ 0 <= prerequisites.length <= 5000
◦ prerequisites[i].length == 2
◦ 0 <= a(i), b(i) < numCourses
◦ prerequisites[i] 中的所有课程对互不相同

讲解算法原理

解法:
算法思路:

原问题可以转换成⼀个拓扑排序问题。
⽤BFS解决拓扑排序即可。
拓扑排序流程:
a. 将所有⼊度为0的点加⼊到队列中;
b. 当队列不空的时候,⼀直循环:
i. 取出队头元素;
ii. 将于队头元素相连的顶点的⼊度-1;
iii. 然后判断是否减成0,。如果减成0,就加⼊到队列中。

编写代码

c++算法代码:

class Solution
{
public:bool canFinish(int n, vector<vector<int>>& p) {unordered_map<int, vector<int>> edges; // 邻接表 vector<int> in(n); // 存储每⼀个结点的⼊度// 1. 建图for(auto& e : p){int a = e[0], b = e[1];edges[b].push_back(a);in[a]++;}// 2. 拓扑排序 - bfsqueue<int> q;// 把所有⼊度为 0 的点加⼊到队列中for(int i = 0; i < n; i++){if(in[i] == 0) q.push(i);}// 层序遍历while(!q.empty()){int t = q.front();q.pop();// 修改相连的边for(int e : edges[t]){in[e]--;if(in[e] == 0) q.push(e);}}// 3. 判断是否有环for(int i : in) if(i)return false;return true;}
};

java算法代码:

class Solution
{public boolean canFinish(int n, int[][] p) {// 1. 准备⼯作int[] in = new int[n]; // 统计每⼀个顶点的⼊度Map<Integer, List<Integer>> edges = new HashMap<>(); // 邻接表存图 // 2. 建图for(int i = 0; i < p.length; i++){int a = p[i][0], b = p[i][1]; // b -> aif(!edges.containsKey(b)){edges.put(b, new ArrayList<>());}edges.get(b).add(a);in[a]++;}// 3. 拓扑排序Queue<Integer> q = new LinkedList<>();// (1) 先把⼊度为 0 的点,加⼊到队列中for(int i = 0; i < n; i++){if(in[i] == 0) q.add(i);}// (2) bfswhile(!q.isEmpty()){int t = q.poll();for(int a : edges.getOrDefault(t, new ArrayList<>())){in[a]--;if(in[a] == 0) q.add(a);}}// 4. 判断是否有环for(int x : in)if(x != 0) return false;return true;}
}

相关文章:

【优选算法】(第四十五篇)

目录 地图分析&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 课程表&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 地图分析&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#…...

自闭症儿童的康复与培养:揭秘有效方法

在生命的广阔画卷中&#xff0c;每一个孩子都是独一无二的色彩&#xff0c;他们带着各自的使命和梦想&#xff0c;踏上人生的旅程。然而&#xff0c;对于自闭症儿童而言&#xff0c;这段旅程似乎更加崎岖和艰难。幸运的是&#xff0c;星贝育园康复中心如同一盏明灯&#xff0c;…...

rom定制系列------小米8澎湃os1.0.28安卓13客户定制固件 刷写以及界面预览

&#x1f49d;&#x1f49d;&#x1f49d; 小米8后置指纹版&#xff0c;机型代码dipper&#xff0c; 官方最终版为12.5.2安卓10的版本。对于一些工作室不太适用。客户需要应用在安卓13的固件。根据客户提供的固件将卡刷改为线刷。并且修改其中客户需求。去除不需要的内置应用以…...

【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】

editor泄露问题通常出现在涉及文件编辑器或脚本编辑器的题目中&#xff0c;尤其是在Web安全或Pwn&#xff08;系统漏洞挖掘&#xff09;类别中。editor泄露的本质是由于系统未能妥善处理临时文件、编辑历史或进程信息&#xff0c;导致攻击者可以通过某种途径获取正在编辑的敏感…...

Chrome谷歌浏览器禁止空格下翻页但可以暂停和播放视频脚本js

前提 播放某些网站的视频的时候(不能网页全屏的视频) 会产生空格下翻页但是不能暂停播放视频&#xff0c;解决方案:下载油猴或者脚本猫把这代码填进去 (function() {use strict;document.body.onkeydown function(event) {var e window.event || event;// 检查是否按下空格…...

【笔记】【YOLOv10图像识别】自动识别图片、视频、摄像头、电脑桌面中的花朵学习踩坑

&#xff08;一&#xff09;启动 创建环境python3.9 打开此环境终端 &#xff08;后面的语句操作几乎都在这个终端执行&#xff09; 输入up主提供的语句&#xff1a;pip install -r requirements.txt 1.下载pytorch网络连接超时 pytorch网址&#xff1a; Start Locally | P…...

H-TCP 的效率和公平性

昨晚带安孩楼下玩耍&#xff0c;用手机 desmos 作了一组 response curve 置于双对数坐标系&#xff1a; 长肥管道的优化思路都很类似&#xff0c;cwnd 增长快一点&#xff1a; BIC TCP&#xff1a;二分查找逼近 capacity&#xff1b;CUBIC TCP&#xff1a;上凸曲线逼近 capa…...

集群与分布式

Cluster(集群)概述 当单独一台主机无法承载现有的用户请求量&#xff1b;或者一台主机因为单一故障导致业务中断的时候&#xff0c;就可以增加服务主机数&#xff0c;这些主机在一起提供服务&#xff0c;就叫集群&#xff0c;而用户所看到的依然是单个的主机&#xff0c;用户并…...

git rebase的常用场景: 交互式变基, 变基和本地分支基于远端分支的变基

文章目录 作用应用场景场景一&#xff1a;交互式变基(合并同一条线上的提交记录) —— git rebase -i HEAD~2场景二&#xff1a;变基(合并分支) —— git rebase [其他分支名称]场景三&#xff1a;本地分支与远端分支的变基 作用 使git的提交记录变得更加简洁 应用场景 场景…...

HttpURLConnection构造请求体传文件

HttpURLConnection构造请求体传文件 在Java中&#xff0c;使用HttpURLConnection构造请求体传输文件&#xff0c;你需要做以下几步&#xff1a; 1、创建URL对象指向你想要请求的资源。 2、通过URL打开连接&#xff0c;转换为HttpURLConnection实例。 3、设置请求方法为POST。 …...

STM32传感器模块编程实践(九) VL53L0X激光红外测距传感器简介及驱动源码

文章目录 一.概要二.VL53L0X测距原理三.VL53L0X主要特性四.VL53L0X硬件参考设计五.模块接线说明六.模块通讯协议介绍七.光学盖玻片介绍八.STM32单片机与VL53L0模块实现距离测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 九.小结 一.概要 VL53L0X是一款由ST&#xff0…...

fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包

fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包 包版本说明 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞…...

VIT:论文关键点解读与常见疑问

VIT贡献点&#xff1a; 1. 首次将 Transformer 应用于图像识别任务 核心贡献&#xff1a;ViT 论文的最大贡献是提出将原本用于自然语言处理&#xff08;NLP&#xff09;的 Transformer 架构成功应用于图像任务。传统的计算机视觉模型主要依赖卷积神经网络&#xff08;CNN&…...

ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南

在地理信息系统&#xff08;GIS&#xff09;的应用中&#xff0c;加载高清影像与街道地图对于地图制图、影像查阅、空间数据分析等工作至关重要。天地图作为官方出品的地图服务&#xff0c;以其标准的数据、较快的影像更新速度等特点受到广泛欢迎。以下是如何在ArcGIS中无插件加…...

工业相机选型(自用笔记)

可参考链接&#xff1a; 相机和镜头选型需要注意哪些问题_靶面尺寸-CSDN博客 工业相机选型方法_ccd工业相机选型步骤-CSDN博客 1、相机 1.1 传感器类型(CCD/CMOS) CCD相机&#xff1a; 1&#xff09;目标是运动的则优先考虑。 2&#xff09;需要高质量图像&#xff0c;如进行…...

【网安笔记】4种拒绝服务攻击

目录 一、SYN Flood 攻击 二、UDP Flood 攻击 三、ICMP Flood 攻击 四、HTTP Flood 攻击 拒绝服务攻击&#xff08;Denial of Service attack&#xff0c;简称 DoS 攻击&#xff09;是指攻击者通过向目标服务器或网络发送大量的请求&#xff0c;使其资源耗尽&#xff0c;无…...

WPF 的组件数据绑定详解

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建 Windows 应用程序的 UI 框架。WPF 提供了强大的数据绑定功能&#xff0c;能够轻松地将 UI 控件与数据源连接&#xff0c;从而实现富用户体验&#xff0c;分离前端设计和业务逻辑。本文将详…...

房子,它或许是沃土

刚成家&#xff0c;来客时&#xff0c;它是客房 成家后&#xff0c;没小孩&#xff0c;它是书房 有小孩&#xff0c;未分房&#xff0c;它暂且是书房 孩子大些&#xff0c;它是孩子们埋下梦想种子&#xff0c;生根发芽的地方...

【Golang】Go语言http编程底层逻辑实现原理与实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…...

SOLIDWORKS参数化软件

在产品设计和工程领域&#xff0c;参数化设计是一种革命性的方法&#xff0c;它允许设计者通过定义一系列规则和关系来创建和修改模型。参数化设计的核心在于将设计过程分解为一系列可调整的参数&#xff0c;如尺寸、形状、材料属性等&#xff0c;这些参数之间通过数学关系相互…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

MyBatis-Plus 常用条件构造方法

1.常用条件方法 方法 说明eq等于 ne不等于 <>gt大于 >ge大于等于 >lt小于 <le小于等于 <betweenBETWEEN 值1 AND 值2notBetweenNOT BETWEEN 值1 AND 值2likeLIKE %值%notLikeNOT LIKE %值%likeLeftLIKE %值likeRightLIKE 值%isNull字段 IS NULLisNotNull字段…...

dvwa11——XSS(Reflected)

LOW 分析源码&#xff1a;无过滤 和上一关一样&#xff0c;这一关在输入框内输入&#xff0c;成功回显 <script>alert(relee);</script> MEDIUM 分析源码&#xff0c;是把<script>替换成了空格&#xff0c;但没有禁用大写 改大写即可&#xff0c;注意函数…...