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

目录

⻜地的数量(medium)

题目解析

讲解算法原理

编写代码

地图中的最⾼点(medium)

题目解析

讲解算法原理

编写代码


⻜地的数量(medium)

题目解析

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

2.题目描述

给你⼀个⼤⼩为 m x n 的⼆进制矩阵 grid ,其中 0 表⽰⼀个海洋单元格、 1 表⽰⼀个陆地单元格。
⼀次移动是指从⼀个陆地单元格⾛到另⼀个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。
返回⽹格中⽆法在任意次数的移动中离开⽹格边界的陆地单元格的数量。

⽰例1:


输⼊:grid=[[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个1被0包围。⼀个1没有被包围,因为它在边界上。
⽰例2:


输⼊:grid=[[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有1都在边界上或可以到达边界。

提⽰:
◦ m == grid.length
◦ n == grid[i].length
◦ 1 <= m, n <= 500
◦ grid[i][j] 的值为 0 或 1

讲解算法原理

解法:
算法思路:
正难则反:

从边上的 1 开始搜索,把与边上 1 相连的联通区域全部标记⼀下;然后再遍历⼀遍矩阵,看看哪些位置的 1 没有被标记即可
标记的时候,可以⽤「多源 bfs 」解决。

编写代码

c++算法代码:

class Solution
{
 int dx[4] = {0, 0, 1, -1};
 int dy[4] = {1, -1, 0, 0};
public:
 int numEnclaves(vector<vector<int>>& grid) 
 {
 int m = grid.size(), n = grid[0].size();
 vector<vector<bool>> vis(m, vector<bool>(n));
 queue<pair<int, int>> q;
 // 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.push({i, j});
 vis[i][j] = true;
 }
 }
 // 2. 多源 bfs
 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 && grid[x][y] == 1 && 
!vis[x][y])
 {
 vis[x][y] = true;
 q.push({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;
 }
};

java算法代码:

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 && x < m && y >= 0 && y < n && grid[x][y] == 1 && 
!vis[x][y])
 {
 q.add(new int[]{x, y});
 vis[x][y] = true;
 }
 }
 }
 // 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;
 }
}

地图中的最⾼点(medium)

题目解析

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

2.题目描述

给你⼀个⼤⼩为 m x n 的整数矩阵 isWater ,它代表了⼀个由陆地和⽔域单元格组成的地图。
• 如果 isWater[i][j] == 0 ,格⼦ (i, j) 是⼀个陆地格⼦。
• 如果 isWater[i][j] == 1 ,格⼦ (i, j) 是⼀个⽔域格⼦。
你需要按照如下规则给每个单元格安排⾼度:
• 每个格⼦的⾼度都必须是⾮负的。
• 如果⼀个格⼦是⽔域,那么它的⾼度必须为 0 。
• 任意相邻的格⼦⾼度差⾄多为 1 。当两个格⼦在正东、南、西、北⽅向上相互紧挨着,就称它
们为相邻的格⼦。(也就是说它们有⼀条公共边)
找到⼀种安排⾼度的⽅案,使得矩阵中的最⾼⾼度值最⼤。
请你返回⼀个⼤⼩为 m x n 的整数矩阵 height ,其中 height[i][j] 是格⼦ (i, j) 的⾼度。如果有多种解法,请返回任意⼀个。

⽰例1:


输⼊:isWater=[[0,1],[0,0]]
输出:[[1,0],[2,1]]
解释:上图展⽰了给各个格⼦安排的⾼度。蓝⾊格⼦是⽔域格,绿⾊格⼦是陆地格。
⽰例2:


输⼊:isWater=[[0,0,1],[1,0,0],[0,0,0]]
输出:[[1,1,0],[0,1,1],[1,2,2]]
解释:所有安排⽅案中,最⾼可⾏⾼度为2。任意安排⽅案中,只要最⾼⾼度为2且符合上述规则的,都为可⾏⽅案。
提⽰:
◦ m == isWater.length
◦ n == isWater[i].length
◦ 1 <= m, n <= 1000
◦ isWater[i][j] 要么是 0 ,要么是 1 。◦ ⾄少有1个⽔域格⼦。

讲解算法原理

解法:
算法思路:

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

编写代码

c++算法代码:

class Solution
{
 int dx[4] = {0, 0, 1, -1};
 int dy[4] = {1, -1, 0, 0};
public:
 vector<vector<int>> highestPeak(vector<vector<int>>& isWater) 
 {
 int m = isWater.size(), n = isWater[0].size();
 vector<vector<int>> dist(m, vector<int>(n, -1));
 queue<pair<int, int>> q;
 // 1. 把所有的源点加⼊到队列⾥⾯
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 if(isWater[i][j])
 {
 dist[i][j] = 0;
 q.push({i, j});
 }
 // 2. 多源 bfs
 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});
 }
 }
 }
 return dist;
 }
};

java算法代码:

class Solution
{
 int[] dx = {0, 0, -1, 1};
 int[] dy = {1, -1, 0, 0};
 public int[][] highestPeak(int[][] isWater) 
 {
 int m = isWater.length, n = isWater[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<>();
 // 1. 所有的源点加⼊到队列⾥⾯
 for(int i = 0; i < m; i++)
 for(int j = 0; j < n; j++)
 if(isWater[i][j] == 1)
 {
 q.add(new int[]{i, j});
 dist[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 && dist[x][y] == -1)
 {
 dist[x][y] = dist[a][b] + 1;
 q.add(new int[]{x, y});
 }
 }
 }
 return dist;
 }
}

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

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

相关文章

在wsl2下将Ubuntu从一个盘移动到其他盘

参考文章&#xff1a; wsl下将Ubuntu从c盘移动到其他盘 WSL数据迁移(迁移ext4.vhdx) WSL 系统迁移&#xff08;2&#xff09;&#xff0c;导入虚拟机磁盘映像 .vhdx ext4/fs WSL2迁移后默认登陆用户为root的解决方案 操作过程&#xff1a; 1.查看当前系统中wsl分发版本 …

MySQL数据库从入门到精通 第2讲 启动 停止 连接

MySQL数据库从入门到精通 第2讲 启动 停止 连接 MySQL数据库的初步使用 在上一小节我们已经简单了解了数据库与一些相关概念 接下来我们来学习下如何使用一下MySQL 1 MySQL的启动 MySQL服务是随着电脑开机自动启动的&#xff0c;在windows中MySQL的服务名称默认就是MySQL8…

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…

【JavaScript】LeetCode:76-80

文章目录 76 有效的括号77 最小栈78 字符串解码79 每日温度80 柱形图中最大的矩形 76 有效的括号 栈三种不匹配的情况&#xff1a; ( [ { } ] ( )&#xff0c;最左边的"("多余&#xff0c;即字符串遍历完了&#xff0c;栈还不为空。[ { ( } } ]&#xff0c;中间"…

机器学习中空间和时间自相关的分析:从理论基础到实践应用

空间和时间自相关是数据分析中的两个基本概念,它们揭示了现象在空间和时间维度上的相互依赖关系。这些概念在各个领域都有广泛应用,从环境科学到城市规划,从流行病学到经济学。本文将探讨这些概念的理论基础,并通过一个实际的野火风险预测案例来展示它们的应用。 图1: 空间自相…

el-radio 点击报错 Element with focus: inputAncestor with aria-hidden....

一、序言 浏览器版本影响的问题&#xff08;与代码无关&#xff0c;可能是web或浏览器相关协议更新导致&#xff09;&#xff0c;不影响功能的使用. 翻译&#xff1a;元素上的Blocked aria-hidden&#xff0c;因为刚刚接收焦点的元素不能对辅助技术用户隐藏。避免在焦点元素或…

DDR Study - LPDDR Initial

参考来源&#xff1a;JESD209-4B 在之前的DDR Study - Basic Understanding中介绍了DDR的基础概念&#xff0c;从这篇文章开始&#xff0c;会基于LPDDR4依次按照如下顺序对LPDDR内容进行简单分析&#xff1a; LPDDR Initial → LPDDR Write Leveling and DQ Training → LPDDR …

Teledyne LeCroy:800G高速以太网一站式自动化测试解决方案(网络打流测试+物理层加压干扰+协议分析)

LinkExpert一站式测试解决方案 LinkExpert 是一款软件应用程序&#xff0c;可对Teledyne LeCroy的协议分析仪和训练器进行自动化硬件控制和管理。除了作为合规性、一致性和验证测试的便捷接口外&#xff0c;它还能轻松地将这些测试添加到自动回归测试流程中。 现在&#xff0c;…

uniapp 获取签名证书 SHA1 自有证书签名打包

1.登录你的Dcloud 账户 2.找到我的应用菜单 3.点开某个应用 4.查看证书详情&#xff0c;里面有SHA1 和别名&#xff0c;密码&#xff0c;下载证书用于云打包&#xff0c;可以选择自有证书&#xff0c;输入别名&#xff0c;密码打包

读数据工程之道:设计和构建健壮的数据系统14源系统

1. 源系统中的数据生成 1.1. 数据工程师的工作是从源系统获取数据&#xff0c;对其进行处理&#xff0c;使其有助于为下游用例提供服务 1.2. 数据工程师的角色将在很大程度上转向理解数据源和目的地之间的相互作用 1.3. 数据工程的最基本的数据管道任务——将数据从A移动到B…

类型转换 与 explicit 关键字作用

例子1&#xff1a; 有时候&#xff0c;如果你不希望编译器帮你自动转换类型&#xff0c;就用关键字 explicit 。 class SampleClass1{ public:operator string() { return string();} };class SampleClass2{ public:explicit operator string() {return string();} };void …

Chrome谷歌浏览器加载ActiveX控件之JT2Go控件

背景 JT2Go是一款西门子公司出品的三维图形轻量化预览解决工具&#xff0c;包含精确3D测量、基本3D剖面、PMI显示和改进的选项过滤器等强大的功能。JT2Go控件是一个标准的ActiveX控件&#xff0c;曾经主要在IE浏览器使用&#xff0c;由于微软禁用IE浏览器&#xff0c;导致JT2Go…

操作系统:进程通信实践-同步又有互斥的信号量机制(详解)

目录 请设计进程既有同步又有互斥的应用场景&#xff0c;并尝试用信号量机制实现。可尝试用有名或无名信号量代码实现上述过程&#xff0c;并给出代码截图、调试过程和运行结果截图。当交换互斥和同步的P&#xff0c;V操作顺序时&#xff0c;程序运行结果是什么&#xff1f; …

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

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

CABiNet:用于低延迟语义分割的高效上下文聚合网络

摘要 随着自主机器需求的不断增加&#xff0c;视觉场景理解的像素级语义分割不仅需要准确&#xff0c;而且需要高效&#xff0c;以满足任何潜在的实时应用需求。在本文中&#xff0c;我们提出了CABiNet&#xff08;Context Aggregated Bi-lateral Network&#xff0c;上下文聚…

力扣3191.使二进制数全变成1

给你一个二进制数组 nums 。 你可以对数组执行以下操作 任意 次&#xff08;也可以 0 次&#xff09;&#xff1a; 选择数组中 任意连续 3 个元素&#xff0c;并将它们 全部反转 。 反转 一个元素指的是将它的值从 0 变 1 &#xff0c;或者从 1 变 0 。 请你返回将 nums 中…

Unity Spine优化思路

最近终于闲下来了&#xff0c;于是开始把近期探索到的unity相关优化整理起来。 我们的项目采用的人物表现方式是spine动画&#xff0c;这在2D游戏里算比较常见的解决方案了&#xff0c;但是里面有一些设置需要提前注意一下&#xff0c;否则会造成不必要的性能浪费。 养成读官…

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…

LabVIEW自动化流动返混实验系统

随着工业自动化的不断发展&#xff0c;连续流动反应器在化工、医药等领域中的应用日益广泛。传统的流动返混实验操作复杂&#xff0c;数据记录和处理不便&#xff0c;基于LabVIEW的全自动流动返混实验系统能自动测定多釜反应器、单釜反应器和管式反应器的停留时间分布&#xff…

pytest框架的allure报告怎么去看

pytest框架的allure报告怎么去看 一、安装jdk和allure1.1安装jdk&#xff08;自行找资料&#xff09;1.2安装Allure 二、编写pytest代码三、执行脚本3.1 运行测试并生成 Allure 结果3.2 你可以使用以下命令来查看生成的报告3.3生成的视图 一、安装jdk和allure 1.1安装jdk&…