首页 > 编程语言 >【优选算法】(第四十四篇)

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

时间:2024-10-16 10:49:01浏览次数:3  
标签:优选 dist int isWater 第四十四 ++ 算法 grid &&

目录

⻜地的数量(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;
 }
}

标签:优选,dist,int,isWater,第四十四,++,算法,grid,&&
From: https://blog.csdn.net/weixin_73861555/article/details/142975249

相关文章

  • R语言使用caret包构建神经网络模型(Neural Network )构建回归模型实战、通过method参数
    R语言使用caret包构建神经网络模型(NeuralNetwork )构建回归模型实战、通过method参数指定算法名称目录R语言使用caret包构建神经网络模型(NeuralNetwork )构建回归模型、通过method参数指定算法名称 #导入包和库#仿真数据#R语言使用caret包构建随机森林模型(randomfore......
  • 常用加解密算法详解与应用指南
    1.引言加解密算法是保证数据安全的基础技术,无论是在数据传输、存储,还是用户身份验证中,都起着至关重要的作用。随着互联网的发展和信息安全威胁的增加,了解并掌握常用的加解密算法已经成为开发者和安全从业者的必修课。本文将详细介绍几种常见的加解密算法,包括对称加密、非......
  • python 实现旋转图片算法
    旋转图片算法介绍旋转图片算法是图像处理中常用的一种技术,它可以将图像中的对象旋转到特定的角度。这种算法在图像处理、计算机视觉、人工智能等领域都有广泛的应用,例如自动驾驶、医学影像、安防监控等场景。以下是旋转图片算法的基本步骤:确定旋转中心点:旋转操作通常围绕......
  • 阿里 C++面试,算法题没做出来,,,
    我本人是非科班学C++ 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​C++研发工程师的面试机会。因为,阿里主要是用Java比较多,C++的岗位比较少​,所以感觉这个机会还是挺难得的。阿里C++研发工程师面试考了我一道类似于快速排序算法的算法题,虽然我算法题又一次没做......
  • 基于常青藤算法优化深度混合核极限学习机(IVY-DHKELM)的数据多变量回归预测 Matlab (
    [原创]基于常青藤算法优化深度混合核极限学习机(IVY-DHKELM)的数据多变量回归预测Matlab(多输入单输出)程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!①将多项式核函数与高斯核函数加权结合,构造出新的混合核函数,并引入自动编码器对极限学习机进行改进,建......
  • 【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻
    文章目录C++双指针详解:进阶题解与思维分析前言第一章:有效三角形的个数1.1有效三角形的个数示例1:示例2:解法一(暴力求解)解法二(排序+双指针)易错点提示代码解读第二章:和为s的两个数字2.1和为s的两个数字示例1:解法一(暴力解法)解法二(双指针-对撞指针)第三章:三......
  • 代码随想录算法训练营第42天 | 第九章动态规划 part2
    文章目录第十章单调栈part0242.接雨水示例数组:过程解释表格:过程解析:双指针法84.柱状图中最大的矩形双指针法单调栈法第十章单调栈part0242.接雨水接雨水这道题目是面试中特别高频的一道题,也是单调栈应用的题目,大家好好做做。建议是掌握双指针和单调栈,因......
  • 【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法
    文章目录LBPH算法一、基本思想二、LBPH算法步骤1.图像划分2.局部二值模式特征提取3.直方图统计4.特征向量生成5.相似度计算三、代码实现1.图像预处理2.创建一个LBPH的人脸识别器3.训练实例模型4.图像预测总结LBPH算法**LBPH(LocalBinaryPatternsHis......
  • 【数据结构与算法】线性表链式存储结构
    线性表链式存储结构文章目录链式存储结构*头结点和头指针一.线性链表(单链表)1.1定义1.2初始化1.2.1带头结点的初始化1.2.2不带头结点的初始化1.3插入1.3.1按位序插入1.3.2指定结点的后插入操作1.3.3指定结点的前插入操作1.4销毁1.5清空1.6删除1.6.1按位序删除1.6.2指定......
  • 【数据结构】:破译排序算法--数字世界的秩序密码(二)
    文章目录前言一.比较排序算法1.`BubbleSort`冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性2.`QuickSort`快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现2.2.非递归快速排序2.2.1.非递归快速排序原......