LeetCode岛屿问题通用解决模板

news/2024/5/16 5:19:07/文章来源:https://blog.csdn.net/CSDN_WYL2016/article/details/129628129

文章目录

  • 前言
  • 第一题:求岛屿的周长
  • 模板整理
    • 遍历方向
    • 确定边界
    • 重复遍历问题处理
  • 模板解第一题
  • 第二题:求岛屿数量
  • 第三题:岛屿的最大面积
  • 第四题:统计子岛屿
  • 第五题:统计封闭岛屿的数目
  • 第六题:最大人工岛
  • 总结

前言

岛屿类问题,最简单的处理方式就是使用深度优先遍历来解,找到一个陆地后,不断的向其上下左右四个方向进行遍历,直到抵达边界或者水域为止。

我们先从一道LeetCode上的题目了解一下一般岛屿类题目的问题场景。

第一题:求岛屿的周长

在这里插入图片描述
题目了解完,我们就先来梳理一下解题思路。

模板整理

首先按照深度优先遍历的思想,肯定是先找到遍历的方式,一般网格类,我们可以按照上下左右四个方向进行遍历,再外加两个参数,r表示行,c表示列。

我们可以写出如下方法。

遍历方向

public void dfs(int[][] grid, int r, int c) {// 上dfs(grid, r - 1, c);// 下dfs(grid, r + 1, c);// 左dfs(grid, r, c - 1);// 右dfs(grid, r, c + 1);
}

假设现在位于坐标(1,1)上,那么其上下左右分别就是(0,1)、(2,1)、(1,0)、(1,2)

在这里插入图片描述
接下来,我们就要考虑边界问题,首先就是网格的边界值,其实也就是行和列的边界值。

确定边界

public void dfs(int[][] grid, int r, int c) {// 网格的边界值if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return;}// 上dfs(grid, r - 1, c);// 下dfs(grid, r + 1, c);// 左dfs(grid, r, c - 1);// 右dfs(grid, r, c + 1);
}

当处理完边界值之后,我们就要考虑遍历到水域的问题了,很明显,当遍历到水域时,也就可以停止了。

public void dfs(int[][] grid, int r, int c) {// 网格的边界值if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return;}// 当遍历到水域时,就应当停止了if (grid[r][c] == 0) {return;}// 上dfs(grid, r - 1, c);// 下dfs(grid, r + 1, c);// 左dfs(grid, r, c - 1);// 右dfs(grid, r, c + 1);
}

重复遍历问题处理

到此,我们已经确定了深度优先遍历的边界条件,现在我们要考虑一下实际场景的问题,按照我们现在的边界停止条件,忽略了如下的场景:

在这里插入图片描述
就是说,坐标(1,1)和(2,1)会互相作用,导致永远搜索不完,所以针对这种情况,我们还需要进行额外的处理,处理方式也很简单,一般情况下我们只需要记录一下每次走过的位置即可,当然方式有很多,比如放到Set集合,岛屿问题可以简单点处理,直接改变原有的值即可,比如直接将1改为2。

那么现在坐标(1,1)的值为2,然后要走到(2,1)

在这里插入图片描述
走到(2,1)后,我们也把值改为2,此时又从坐标(2,1)开始遍历,当向上遍历到(1,1)时就会直接停止了,因为此时(1,1)的值已经被改为2,即表示遍历过了。

在这里插入图片描述
到此为止,我们就算完成了一个标准的深度遍历模板了,现在可以用它来解题了!

模板解第一题

我们回到求岛屿的周长的问题,可以发现,所要找的岛屿的边,可以分为两种情况,一种是当遍历到网格边界时,其边界就是一条边,第二种情况就是,当遍历到水域时,也会有一条边。

在这里插入图片描述

代码如下

public int islandPerimeter(int[][] grid) {for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {// 当遇到水域时,开始进行遍历if (grid[i][j] == 1) {return dfs(grid, i, j);}}}return 0;}public int dfs(int[][] grid, int r, int c) {// 走向边界,周长加1if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return 1;}// 走向水域,周长加1if (grid[r][c] == 0) {return 1;}// 遍历过了,周长不变,直接返回if (grid[r][c] == 2) {return 0;}// 遍历过的陆地,设置为2,以免重复遍历grid[r][c] = 2;// 最后累加所有遍历结果return dfs(grid, r - 1, c)+ dfs(grid, r + 1, c)+ dfs(grid, r, c - 1)+ dfs(grid, r, c + 1);}

第二题:求岛屿数量

在这里插入图片描述

下图,总共有3个岛屿
在这里插入图片描述

这题基本上就是直接套用模板即可完成。

public int numIslands(char[][] grid) {int ans = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {// 每次遇到陆地就加1,因为一旦遇到陆地,dfs就会一次性把联通的陆地全部改为2if (grid[i][j] == '1') {ans++;dfs(grid, i, j);}}}return ans;
}
private void dfs(char[][] grid, int r, int c) {// 网格的边界值if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return;}// 当遍历到水域时,就应当停止了// 遍历过的也可以停止了if (grid[r][c] == '0' || grid[r][c] == '2') {return;}// 改为2,表示遍历过了grid[r][c] = '2';// 上dfs(grid, r - 1, c);// 下dfs(grid, r + 1, c);// 左dfs(grid, r, c - 1);// 右dfs(grid, r, c + 1);
}

第三题:岛屿的最大面积

在这里插入图片描述
这题实际上就是遍历出所有岛屿,然后比较每个岛屿的大小,岛屿的大小也很容易得到。
在原有模板的基础上只需要稍微变动一下,即每次能走到陆地时加1即可,这样就能统计出每一片岛屿的大小。

代码如下

public int maxAreaOfIsland(int[][] grid) {int ans = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 1) {ans = Math.max(ans, dfs(grid, i, j));}}}return ans;
}
public int dfs(int[][] grid, int r, int c) {// 走向边界,面积不变if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return 0;}// 走向水域,或者走过的陆地时,面积不变if (grid[r][c] == 0 || grid[r][c] == 2) {return 0;}grid[r][c] = 2;// 累积当前遍历到的岛屿面积return 1 + dfs(grid, r - 1, c)+ dfs(grid, r + 1, c)+ dfs(grid, r, c - 1)+ dfs(grid, r, c + 1);
}

第四题:统计子岛屿

在这里插入图片描述
求子岛屿的意思,可以看作就是,求grid2是陆地,且在grid1也是陆地的部分,根据题目中的示例1所示结果:
在这里插入图片描述

为了区分出红色1的部分,我们必须给出额外的标记,比如我们可以把1改为2,变成下图这样:

在这里插入图片描述

此时的网格与我们之前遇到的都不太一样,因为他出现了3种情况,即0,1,2,不过也不会很麻烦,我们只要认为现在0,1都是水域即可。

因此我们套用模板,代码如下:

public int countSubIslands(int[][] grid1, int[][] grid2) {int ans = 0;// 找到grid1和grid2重叠的部分,将grid2重叠的部分加1,直接用grid2[i][j] += grid1[i][j],即可完成。for (int i = 0; i < grid2.length; i++) {for (int j = 0; j < grid2[0].length; j++) {if (grid2[i][j] == 1) {grid2[i][j] += grid1[i][j];}}}// 此时,grid2,出现了3种情况,即0,1,2,我们可以认为0和1都不是陆地for (int i = 0; i < grid2.length; i++) {for (int j = 0; j < grid2[0].length; j++) {if (grid2[i][j] == 2) {ans++;dfs(grid2, i, j);}}}return ans;
}
public void dfs(int[][] grid, int r, int c) {// 网格的边界值if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return;}// 此时遍历到0和1,就应当停止了// 3表示遍历过的,也可以停止了if (grid[r][c] == 0 || grid[r][c] == 1 || grid[r][c] == 3) {return;}// 改为3,表示遍历过了grid[r][c] = 3;// 上dfs(grid, r - 1, c);// 下dfs(grid, r + 1, c);// 左dfs(grid, r, c - 1);// 右dfs(grid, r, c + 1);
}

如果,按照上述代码去执行,你会发现结果会多出一个岛屿来。

即右下角那一块,按照题目含义,这一部分是不能算做子岛屿的
在这里插入图片描述

所以,我们还得额外处理一下2与1联通的情况,这种情况下是不能算做是子岛屿的,所以我们就还是需要将1和2一起来遍历,只不过遍历到1时要额外记录一下。

此时求解的问题可以转换为:遍历每一块岛屿,且每一块岛屿都由2组成。

最终代码实现

public int countSubIslands(int[][] grid1, int[][] grid2) {int ans = 0;// 找到grid1和grid2重叠的部分,将grid2重叠的部分加1,直接用grid2[i][j] += grid1[i][j],即可完成。for (int i = 0; i < grid2.length; i++) {for (int j = 0; j < grid2[0].length; j++) {if (grid2[i][j] == 1) {grid2[i][j] += grid1[i][j];}}}// 此时,grid2,出现了3种情况,即0,1,2,我们可以认为0和1都不是陆地,但遇到1需要额外记录,由于只有两种情况,遇到或没遇到,因此我们可以直接用boolean来代替for (int i = 0; i < grid2.length; i++) {for (int j = 0; j < grid2[0].length; j++) {if (grid2[i][j] == 2) {// dfs结果为true,表示没有遇到1if (dfs(grid2, i, j)) {ans++;}}}}return ans;
}
public boolean dfs(int[][] grid, int r, int c) {// 网格的边界值if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return true;}// 当遍历遇到1时,记录为falseif (grid[r][c] == 1) {return false;}// 其他情况,都返回trueif (grid[r][c] == 0 || grid[r][c] == 3) {return true;}// 改为3,表示遍历过了grid[r][c] = 3;// 注意这里要使用单&来处理,因为要走完每一条路,不然会出现漏改为3的情况return  // 上dfs(grid, r - 1, c) &// 下dfs(grid, r + 1, c) &// 左dfs(grid, r, c - 1) &// 右dfs(grid, r, c + 1);
}

第五题:统计封闭岛屿的数目

封闭岛屿的定义,可以理解为:它是一个不在边界值上的岛屿,即满足岛屿的同时也满足0不会在落在网格的4条边上,有了这个条件之后,我们就好处理了,和第四题一样,还是可以用boolean值来做一个遍历到边界的额外记录。
在这里插入图片描述

吐槽一下出题者,不按套路出牌,0是陆地,1是水域,这和前面的几题的定义是反过来的。。。

本题的模板,在判断边界条件时稍有改动,当走到边界时可以直接完成判断,和前面对比,也就少了一步标记为走过的,以及继续顺着走下去的情况。

之所以可以这样,是因为在所有的边界上,只要有一个不满足条件,那么就不满足封闭岛屿的要求。

比如,像下图这样,当从坐标(1,2),走向坐标(0,2)后,对于之前的题目,我们是需要从(0,2)开始继续向上下左右四个方向遍历的,但对于本题,就不需要了,因为一旦判断出(0,2)值为0,就可以确定这片为非封闭岛屿了。
在这里插入图片描述

套用模板后,代码如下:

public int closedIsland(int[][] grid) {int ans = 0;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {// 注意本题0是陆地,1是水域。。。if (grid[i][j] == 0 && dfs(grid, i, j)) {ans++;}}}return ans;
}
public boolean dfs(int[][] grid, int r, int c) {// 遇到网格的边界值时,判断是不是水域,只有是水域时才满足封闭岛屿的要求,// 如果是陆地,不满足封闭岛屿的要求,因此可以不用继续顺着走下去了。// 如果是水域,不满足岛屿的要求,因此也不用继续顺着走下去了。if (r == 0 || c == 0 || r == grid.length - 1 || c == grid[0].length - 1) {return grid[r][c] == 1;}// 当遍历到水域时,就应当停止了// 遍历过的也可以停止了if (grid[r][c] == 1 || grid[r][c] == 2) {return true;}// 改为2,表示遍历过了grid[r][c] = 2;return// 上dfs(grid, r - 1, c) &// 下dfs(grid, r + 1, c) &// 左dfs(grid, r, c - 1) &// 右dfs(grid, r, c + 1);
}

第六题:最大人工岛

在这里插入图片描述

{1,0},{0,1}举例,如下图:
在这里插入图片描述

可以改变{1,1}的值,得到岛屿面积为3
在这里插入图片描述

也可以改变{0,0}的值,同样得到岛屿面积为3
在这里插入图片描述

本题的思路,我们可以先计算每一片岛屿的面积,然后找到只隔一块水域的两个岛屿,相加其面积即可得到结果。

步骤分解:

1. 计算每一片岛屿的面积

这个好实现,就是前面第三题的方式。

2. 找到只隔一块水域的两个岛屿

当我们找到岛屿之后,就可以遍历所有水域,然后搜索每一块水域的上下左右,看看是不是岛屿,如果是岛屿就加上岛屿的面积。

因为要求水域的上下左右是不是岛屿,因此我们在计算每一片岛屿的面积的时候,可以顺带记录下每一片岛屿中陆地的坐标,这样即可根据坐标判断其是不是岛屿。

如下图,坐标{1,1}上下左右都是岛屿,并且每一片岛屿的面积都为1,因此最终面积为5,
其余坐标{0,0},{0,2},{2,0},{2,2}上下左右遍历后,最终面积都为3。
在这里插入图片描述

上述分析中,我们忽略了一种场景,如下图:

现在坐标{1,1}的上、左,和下、右,虽然都是岛屿,但上、左和下、右实际分别都是同一个岛屿,如果不处理的话,就会出现重复累加面积的情况,向上遍历时,发现岛屿面积为3,向左遍历时,也发现岛屿面积为3,最终会加两次3,导致结果错误。
在这里插入图片描述
因此针对这种情况,我们就需要标记出每一个陆地的归属岛屿,这样当我们从水域开始进行上下左右遍历到陆地时,再判断陆地是不是归属于同一个岛屿即可避免重复计算的问题。

为了方便满足上述场景,我们可以使用一个Map来记录,Key直接记录为坐标,Value记录坐标对应的岛屿,以及岛屿的面积。

最终代码实现如下:

public int largestIsland(int[][] grid) {int ans = 0;// key为坐标,value为坐标对应的岛屿信息,包含:岛屿编号、岛屿面积Map<String, IslandInfo> islandMap = new HashMap<>();// 岛屿编号int id = 1;for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 1) {int area;IslandInfo islandInfo = new IslandInfo();// 使用求岛屿面积的方式,只是多传了两个参数,用于处理islandMap信息area = dfs(grid, i, j, islandMap, islandInfo);// 设置岛屿编号和面积islandInfo.id = id++;islandInfo.area = area;// 针对全岛屿情况,特殊处理ans = Math.max(ans, area);}}}// 下面开始针对水域做处理,只要遍历每个水域的上下左右,如果发现是岛屿,并且岛屿编号不相同,即可加上岛屿面积。for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {if (grid[i][j] == 0) {// 找到上下左右String up = search(grid, i - 1, j);String down = search(grid, i + 1, j);String left = search(grid, i, j - 1);String right = search(grid, i, j + 1);// 如果上下左右是岛屿,就从islandMap中取得岛屿信息IslandInfo upIsland = new IslandInfo();if (up != null) {upIsland = islandMap.get(up);}IslandInfo downIsland = new IslandInfo();if (down != null) {downIsland = islandMap.get(down);}IslandInfo leftIsland = new IslandInfo();if (left != null) {leftIsland = islandMap.get(left);}IslandInfo rightIsland = new IslandInfo();if (right != null) {rightIsland = islandMap.get(right);}// 确认相邻岛屿非同一个岛屿后,即可累加相邻岛屿面积int area = upIsland.area;if (upIsland.id != downIsland.id) {area += downIsland.area;}if (upIsland.id != leftIsland.id && leftIsland.id != downIsland.id) {area += leftIsland.area;}if (upIsland.id != rightIsland.id && rightIsland.id != downIsland.id && rightIsland.id != leftIsland.id) {area += rightIsland.area;}ans = Math.max(ans, area + 1);}}}return ans;}/*** 非陆地返回:null* 陆地返回:陆地坐标*/public String search(int[][] grid, int r, int c) {// 边界非陆地if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return null;}// 返回陆地坐标if (grid[r][c] == 2) {return r + "," + c;}return null;}/*** 通用模板,在计算岛屿面积的基础上,通过islandMap记录每一块陆地的坐标*/public int dfs(int[][] grid, int r, int c, Map<String, IslandInfo> islandMap, IslandInfo islandInfo) {if (r < 0 || r >= grid.length || c < 0 || c >= grid[0].length) {return 0;}if (grid[r][c] == 0 || grid[r][c] == 2) {return 0;}grid[r][c] = 2;islandMap.put(r + "," + c, islandInfo);return 1 + dfs(grid, r - 1, c, islandMap, islandInfo) +dfs(grid, r + 1, c, islandMap, islandInfo) +dfs(grid, r, c - 1, islandMap, islandInfo) +dfs(grid, r, c + 1, islandMap, islandInfo);}
/*** 岛屿信息*/
class IslandInfo {// 默认编号为0int id;// 默认面积为0int area;
}

总结

通过上面6题,应该可以体会出通用解决模板的套路,无论题目如何变化,其边界判断、水域、陆地判断、上下左右遍历都是非常标准的解决岛屿问题的方式,只要掌握了这个套路,其他无非就是在其基础上演化处理而已。

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

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

相关文章

04.hadoopHDFS

win java访问hadoop //复制文件夹,配置环境变量//配置HADOOP_HOME为我们的路径 ,hadoop-3.3.0 ,记得JAVA_HOME不要带有空格,!!!默认java安装环境有空格C:\Program Files//要在cmd hadoop -fs 查看是否配置成功//%HADOOP_HOME%\bin到path//maven添加依赖hadoop3.1.0//创建目录Be…

常见的CMS后台getshell姿势总结

目录 WordPress dedecms aspcms 南方数据企业系统 phpmyadmin日志 pageadmin 无忧企业系统 WordPress 默认后台登录地址 /wp-login.php /wp-admin 登录后在外观的编辑里面找一个模板&#xff0c;我们在404模板 (404.php)里面写入一句话后门 可以蚁剑连接 上传一个压缩…

自定义类型的超详细讲解ᵎᵎ了解结构体和位段这一篇文章就够了ᵎ

目录 1.结构体的声明 1.1基础知识 1.2结构体的声明 1.3结构体的特殊声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐 那对齐这么浪费空间&#xff0c;为什么要对齐 1.7修改默认对齐数 1.8结构体传参 2.位段 2.1什么是位段 2.2位段的内存分配…

web前端框架——Vue的特性

目录 前言&#xff1a; 一.vue 二.特性 1.轻量级 2.数据绑定 3.指令 4.插件 三.比较Angular 、React 、Vue 框架之间的比较 1. Angular Angular的优点&#xff1a; 2. React React 的优点&#xff1a; 3.vue 3.Vue的优点&#xff1a; 前言&#xff1a; 本篇文章…

QT开发笔记(多媒体)

多媒体 多媒体&#xff08;Multimedia&#xff09;是多种媒体的综合&#xff0c;一般包括文本&#xff0c;声音和图像等多种媒体形式。 在计算机系统中&#xff0c;多媒体指组合两种或两种以上媒体的一种人机交互式信息交流和传播媒体。 使用的媒体包括文字、图片、照片、声音…

头歌c语言实训项目-函数(2)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 第1关&#xff1a;模拟投掷骰子游戏: 题目&#xff1a; 代码思路&#xff1a; 代码表示&#xff1a; 第…

20230322英语学习

Why Are So Many Gen Z-Ers Drawn to Old Digital Cameras? 老式数码相机&#xff1a;Z世代的复古潮流 The latest digital cameras boast ever-higher resolutions, better performance in low light, smart focusing and shake reduction – and they’re built right into …

牛客C/C++刷题笔记(五)

122、对于"int *pa[5]&#xff1b;"的描述中&#xff0c;&#xff08; &#xff09;是正确的。 123、以下叙述中正确的是&#xff08;&#xff09; C语言的源程序中对缩进没有要求,所以A选项错误。C语言中区分大小写,main函数不能写成Main或_main,所以B选项错误。一…

声声不息,新“声”报到

魅力声音大家庭总群&#xff08;10&#xff09;大玲&#xff0c;刚见到新来的四川孩儿——樱桃&#xff0c;真是太可爱了&#xff01;可不就是&#xff0c;这孩儿真是招人稀罕&#xff0c;我现在就把她拉到咱大群里“大玲” 邀请 “樱桃” 加入群聊所有人 咱们大家庭迎来了第一…

【字符串】刷题

P4173残缺的字符串心得&#xff1a;这道题&#xff0c;我觉得是不难的&#xff0c;代码逻辑很清晰&#xff0c;但是提交就是有问题最后发现两个问题&#xff1a;scanf输入字符后要用getchar() 吞回车 !!!!&#xff08;天坑用 scanf 输入时&#xff0c;不管输入什么&#xff0c;…

C语言小程序:通讯录(静态版)

哈喽各位老铁们&#xff0c;今天给大家带来一期通讯录的静态版本的实现&#xff0c;何为静态版本后面会做解释&#xff0c;话不多说&#xff0c;直接开始&#xff01;关于通讯录&#xff0c;其实也就是类似于我们手机上的通讯录一样&#xff0c;有着各种各样的功能&#xff0c;…

30天从零到1创业螺旋式

趁梦想还在&#xff0c;想去的地方&#xff0c;现在就去&#xff1b;想做的事情&#xff0c;现在就做。一开始立刻启动的你的项目&#xff0c;安排好时间计划&#xff0c;拆分微模块&#xff0c;每天花20分钟去完善产品&#xff0c;去改变世界。可以为自己的创意设置临时办公室…

RK3588平台开发系列讲解(显示篇)DP显示调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看 connector 状态二、强制使能/禁⽤ DP三、DPCP 读写四、Type-C 接口 Debug五、查看 DP 寄存器六、查看 VOP 状态七、查看当前显示时钟八、调整 DRM log 等级沉淀、分享、成长,让自己和他人都能有所收获!😄…

【数据结构】链队列的C语言实现

队列 1.队列的概念 队列 和栈一样&#xff0c;是一个 特殊的线性表。 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。进行 插入操作 的一端称为 队尾&#xff0c;进行 删除操作 的一端称为队头。 队列中的元素遵守 先进先出(First I…

【类的继承与派生的知识点】

文章目录类的继承与派生的知识点类的继承与派生&#xff1a;类成员的访问&#xff1a;类型兼容规则&#xff1a;一个公有派生类的对象在使用上可以被当成基类的对象&#xff0c;反之不行单继承与多继承派生类的构造与析构类成员的标识与访问类的继承与派生的实验结果类型兼容规…

Baumer工业相机堡盟相机如何使用Sharpening图像锐化功能( Sharpening图像锐化功能的优点和行业应用)(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

【计算机网络】如何解决TCP粘包问题?

【计算机网络】如何解决TCP粘包问题&#xff1f; 文章目录【计算机网络】如何解决TCP粘包问题&#xff1f;如何理解字节流&#xff1f;如何解决粘包&#xff1f;固定长度的消息特殊字符作为边界自定义消息结构如何理解字节流&#xff1f; 之所以会说 TCP 是面向字节流的协议&a…

RK3588编译环境Ubuntu20.04编译配置-增加交换内存

迅为提供的编译环境 Ubuntu20.04 默认配置了交换内存是 9G&#xff0c;如果在编译过程中&#xff0c;因内 存不够而编译报错&#xff0c;可以参考本小节进行设置。 这里举例分配 5G 交换内存。 在开始之前&#xff0c;使用命令检查一下您的 ubuntu 的 swap 分区。 sudo swa…

Android进阶面经,面试10余家经验分享,拿到offer真不难~

前言 我们都知道面试大厂主要就是考察程序员技术方向的专业技能&#xff0c;Java开发主要考察的就是Java方面的专业技能&#xff0c;而Android岗位的 专业技能 就是Android程序员面试的重要考察方向。 大厂的招聘条件是明牌的&#xff0c;但技术这一块却难倒了大部分的人。 面…

蓝桥杯刷题冲刺 | 倒计时18天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录0.知识点1.乳草的入侵今天写 搜索题 0.知识点 DFS 设计步骤 确定该题目的状态&#xff08;包括边…