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

news/2024/10/22 15:04:30/

目录

⻜地的数量(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. 多源 bfswhile(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算法代码:

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. 多源 bfswhile(!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. 多源 bfswhile(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算法代码:

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. 多源 bfswhile(!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;}
}


http://www.ppmy.cn/news/1541082.html

相关文章

LTD助力经营数字化,浙商数智营销学堂开讲入站营销新理念

在10月18日下午&#xff0c;杭州电子商务研究院精心策划并成功举办了首期“浙商数智营销学堂”。这场盛会在创业氛围浓郁的浙商大创业园好望院内拉开帷幕&#xff0c;吸引了来自全国各地的30多位企业家、高管代表共襄盛举。 赵浩兴院长 赵浩兴院长代表杭州电子商务研究院致开幕…

[笔记] 关于CreateProcessWithLogonW函数创建进程

函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …

特征交叉03 LHUC (PPNet)

LHUC 只能用于精排。 多目标模型中的神经网络可以用全连接网络 、深度交叉网络 或者LHUC等。 语音识别中的LHUC 说话者的特征, 例如id 做embadding 。LHUC中出现的神经网络有多个全连接层&#xff0c;最后一个全连接层的激活函数是sigmoid *2&#xff0c;单独作用到每一个元素…

Solon 3.0 新特性:HttpUtils 了解一下

Solon 3.0 引入一个叫 HttpUtils 小插件&#xff0c;这是一个简单的同步 HTTP 客户端&#xff0c;基于 URLConnection 适配&#xff08;也支持切换为 OkHttp 适配&#xff09;。使得编写 HTTP 客户端代码更加直观和易于阅读。 使用 URLConnection 适配时&#xff08;大小为 40…

Redis Search系列 - 第六讲 基准测试 - Redis Search VS. MongoDB VS. ElasticSearch

目录 一、引言二、Redis Search 2.x版本的性能提升三、Redis Search VS. MongoDB VS. ElasticSearch3.1 测试环境3.2 100%写 - 基准测试3.3 100%读 - 基准测试3.4 混合读/写/搜索 - 基准测试2.5 搜索延迟分析3.6 读延迟分析3.7 写延迟分析3.8 Redis Search VS. ElasticSearch3.…

程序员的浪漫之给对象爬数据,没想到过程中竟然被写接口的老哥字段命名给秀到了!

目录 一、序言二、分析需求三、找数据分析字段四、建个表开爬数据五、结语 一、序言 最近对象转了销售岗&#xff0c;她的领导布置了项任务&#xff0c;一周要找500个对标客户的联系电话。看她又上天眼查、企查查、爱企查&#xff0c;还上各种采购平台手动抄采购负责人的信息和…

基于SSM机场网上订票系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;机票信息管理&#xff0c;订单信息管理&#xff0c;机场广告管理&#xff0c;系统管理 前台账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;机票信息&#xf…

js 鼠标拖动canvas画布

功能点&#xff1a; 鼠标拖拽canvas画布移动鼠标检测rect鼠标检测circle 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-sc…