算法day29

2024-06-14 11:36
文章标签 算法 day29

本文主要是介绍算法day29,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第一题

695. 岛屿的最大面积

        本题解法:采用bfs的算法;

        本题使用象限数组的遍历方法和定义布尔数组vis来遍历每一个元素的上下左右元素,防治被遍历的元素被二次遍历;

        本题具体分析如上题故事,但是由于要求区域的最大面积,所以在bfs方法中找到合适的元素进行入队列操作时,我们要对其个数进行统计;

至此,代码如下:

class Solution {//象限坐标数组int[] dx = {0,0,1,-1};int[] dy = {1,-1,0,0};boolean[][] vis = new boolean[51][51];int m,n;public int maxAreaOfIsland(int[][] grid) {m = grid.length;n = grid[0].length;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 = Math.max(ret,bfs(grid,i,j));}}}return ret;}public int bfs(int[][] grid,int i,int j){int cot = 0;Queue<int[]> q = new LinkedList<>();q.add(new int[]{i,j});vis[i][j] = true;cot++;while(!q.isEmpty()){int[] t = q.poll();int a = t[0],b = t[1];for(int s = 0;s < 4;s++){int x = a +dx[s],y = b + dy[s];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;cot++;}}       }return cot;}
}

第二题

130. 被围绕的区域

解法:bfs层序遍历

解题步骤如下:

步骤一:

        如上图所示,首先遍历第一行,最后一行,第一列,最后一列的元素,查找与其相邻的元素,并将这些元素o变成符号*;

步骤二:

        遍历整个图像中所有的元素,遇到的o字符变成x字符,遇到的*字符变成o字符,如此满足题意;

至此,代码如下:

class Solution {//象限坐标数组int[] dx = {0,0,1,-1};int[] dy = {1,-1,0,0};int m,n;public void solve(char[][] board) {m = board.length;n = board[0].length;//1、先处理边界的0,全部修改成*//修改第一行和最后一行for(int j = 0;j < n;j++){if(board[0][j] == 'O' ) bfs(board,0,j);if(board[m-1][j] == 'O' ) bfs(board,m-1,j);}//修改第一列和最后一列for(int i = 0;i < m;i++){if(board[i][0] == 'O' ) bfs(board,i,0);if(board[i][n-1] == 'O' ) bfs(board,i,n-1);}//2、还原,将剩下的0变成x,将边缘的*变为0for(int i = 0;i< m;i++){for(int j = 0;j < n ;j++){if(board[i][j] == 'O') board[i][j] = 'X';else if(board[i][j] == '*') board[i][j] = 'O';}}}public void bfs(char[][] board,int i,int j){Queue<int[]> q = new LinkedList<>();q.add(new int[]{i,j});board[i][j] = '*';while(!q.isEmpty()){int[] t = q.poll();int a = t[0],b = t[1];for(int s = 0;s < 4;s++){int x = a +dx[s],y = b + dy[s];if(x >= 0 && x <m && y >= 0 && y < n && board[x][y] == 'O' ){board[x][y] = '*';q.add(new int[]{x,y});}}       }}
}

第三题

1926. 迷宫中离入口最近的出口

本题的题目类型可以理解为边权为1的最短路问题;

        迷宫游戏,其数据结构模拟:一个迷宫矩阵,当每一个二维坐标相对性的字符为+,则是路障,坐标对应的字符为.,则表示是可以前进的路,当前我们所在的位置就是一个二维坐标对应的坐标;

        由于我们的安全出口的路线就是从给定的位置开始移动,移动到边界;且在所能到达安全出口的所有路线里面返回最短的路线(即最少的移动次数)

        我们在遍历当前位置的上下左右合法位置的时候采用的象限数组的方法,同时由于移动之后我们不能原路返回,所以采用定义布尔数组vis,给每一个遍历过的位置在该数组里面定义为true,防治二次遍历;

        我们将初识位置放于队列中,将该位置的上下左右位置都进行过遍历,每遍历到一个合法的位置,就将该位置放于队列中,且定义的统计移动次数的cot加一,当遍历到矩阵的边界时候,返回最短的cot变量;

        至此,代码如下:

class Solution {//象限坐标数组int[] dx = {0,0,1,-1};int[] dy = {1,-1,0,0};public int nearestExit(char[][] maze, int[] entrance) {int m= maze.length,n = maze[0].length;boolean[][] vis = new boolean[m][n];Queue<int[]> q = new LinkedList<>();q.add(new int[]{entrance[0],entrance[1]});vis[entrance[0]][entrance[1]]  = true;int step = 0;while(!q.isEmpty()){step++;int sz = q.size();for(int i = 0;i < sz;i++){int[] t = q.poll();int a = t[0],b = t[1];for(int j = 0;j<4;j++){int x = a +dx[j],y = b + dy[j];if(x >= 0 && x <m && y >= 0 && y < n && maze[x][y] == '.' && !vis[x][y]){//判断是否已经走出出口if(x == 0|| x == m-1 || y == 0 || y == n-1) return step;q.add(new int[]{x,y});vis[x][y] = true;}}}}return -1;}
}

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

这篇关于算法day29的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060294

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖