《剑指 Offer》专项突破版 - 面试题 105 和 106 : 最大的岛屿和二分图(C++ 实现)

目录

面试题 105 : 最大的岛屿

面试题 106 : 二分图


 


面试题 105 : 最大的岛屿

题目

海洋岛屿地图可以用由 0、1 组成的二维数组表示,水平或竖直方向相连的一组 1 表示一个岛屿,请计算最大的岛屿的面积(即岛屿中 1 的数目)。例如,在下图中有 4 个岛屿,其中最大的岛屿的面积为 5。

分析

应用与图相关的算法解决问题的第 1 步是找出问题中隐含的图。看到这个题目之后,可能会有人问:输入的是一个矩阵,图在哪里?其实图是节点(即顶点)和边的集合,因此需要找出图的节点和边。这个题目关注的是地图中的岛屿,也就是矩阵中的 1。矩阵中的每个值为 1 的格子都是图中的一个节点。矩阵中的一个格子可能与位于它上、下、左、右的 4 个格子相邻,两个相邻的值为 1 的格子之间有一条边相连。例如,可以用下图表示上图中的岛屿。

即一个非连通图中有 4 个连通分量,通过计算每个连通分量中节点的数目,就能知道最大的岛屿的面积为 5

int maxAreaOfIsland(vector<vector<int>>& grid) {int rows = grid.size(), cols = grid[0].size();vector<vector<bool>> isVisited(rows, vector<bool>(cols, false));
​int maxArea = 0;for (int i = 0; i < rows; ++i){for (int j = 0; j < cols; ++j){if (grid[i][j] == 1 && !isVisited[i][j]){int area = getArea(grid, isVisited, i, j);maxArea = max(maxArea, area);}}}return maxArea;
}

广度优先搜索

int getArea(vector<vector<int>>& grid, vector<vector<bool>>& isVisited, int i, int j) {queue<vector<int>> q;q.push(vector<int>{ i, j });isVisited[i][j] = true;
​vector<vector<int>> dirs = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };int area = 0;while (!q.empty()){vector<int> front = q.front();q.pop();++area;
​for (vector<int>& dir : dirs){int r = front[0] + dir[0];int c = front[1] + dir[1];if (r >= 0 && r < grid.size() &&c >= 0 && c < grid[0].size() &&grid[r][c] == 1 && !isVisited[r][c]){q.push(vector<int>{ r, c });isVisited[r][c] = true;}}}return area;
}

上述代码中队列的元素为矩阵中的坐标,每个坐标都包含行号和列号这两个值,用一个长度为 2 的数组表示

二维数组 dirs 表示在矩阵中向上、下、左、右这 4 个方向前进一步时坐标的变化。在矩阵中向上移动一步时行号减 1 而列号不变,所以坐标的改变值为 (-1, 0),其他方向的改变值类似。用当前坐标加上坐标的改变值就得到向不同方向前进一步之后的坐标。这样写代码的好处是容易用一个简洁的循环实现向 4 个不同方向前进

深度优先搜索

int getArea(vector<vector<int>>& grid, vector<vector<bool>>& isVisited, int i, int j) {isVisited[i][j] = true;int area = 1;
​vector<vector<int>> dirs = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 }};for (vector<int>& dir : dirs){int r = i + dir[0];int c = j + dir[1];if (r >= 0 && r < grid.size() && c >= 0 && c < grid[0].size() &&grid[r][c] == 1 && !isVisited[r][c]){area += getArea(grid, isVisited, r, c);}}return area;
}


面试题 106 : 二分图

题目

如果能将一个图中的节点分成 A、B 两部分,使任意一条边的一个节点属于 A 而另一个节点属于 B,那么该图就是一个二分图。输入一个由数组 graph 表示的图,graph[i] 中包含所有和节点 i 相邻的节点,请判断该图是否为二分图。

例如,如果输入 graph 为 [[1, 3], [0, 2], [1, 3], [0, 2]],那么可以将节点分为 { 0, 2 }、{ 1, 3 } 两个部分,因此该图是一个二分图,如下图 (a) 所示。如果输入 graph 为 [[1, 2, 3], [0, 2], [0, 1, 3], [0, 2]],那么该图是一个非二分图,如下图 (b) 所示。

分析

根据题目提供的信息,二分图的节点可以分成两种不同的类型,任意一条边的两个节点分别属于两种不同的类型。可以为图中的所有节点着色,两种不同类型的节点分别涂上不同的颜色。如果任意一条边的两个节点都能被涂上不同的颜色,那么整个图就是一个二分图

一个图可能包含多个连通分量,需要逐一对每个连通分量着色

bool isBipartite(vector<vector<int>>& graph) {int n = graph.size();vector<int> colors(n, -1);for (int i = 0; i < n; ++i){if (colors[i] == -1){if (!setColor(graph, colors, i, 0))return false;}}return true;
}

图中有 n 个节点,于是创建一个长度为 n 的数组 colors 记录每个节点的颜色,节点 i 的颜色保存在 colors[i] 中

  1. 如果节点 i 还没有被着色,那么 colors[i] 的值为 -1

  2. 如果节点 i 已经被着色,那么 colors[i] 的值为 0 或 1

函数 setColor 用来对以节点 i 为起始节点的一个连通分量着色,它的返回值用来表示能否按照二分图的规则对连通分量的所有节点进行着色。为了能够给所有节点着色,需要搜索所有与节点 i 连通的节点,每搜索到一个尚未着色的节点就按照二分图的规则给它涂上颜色

利用广度优先搜索对连通分量着色

bool setColor(vector<vector<int>>& graph, vector<int>& colors, int i, int color) {queue<int> q;q.push(i);colors[i] = color;while (!q.empty()){int pos = q.front();q.pop();for (int adjPos : graph[pos]){if (colors[adjPos] == -1){q.push(adjPos);colors[adjPos] = 1 - colors[pos];}else{if (colors[adjPos] == colors[pos])return false;}}}return true;
}

利用深度优先搜索对连通分量着色

bool setColor(vector<vector<int>>& graph, vector<int>& colors, int i, int color) {if (colors[i] >= 0)return colors[i] == color;
​colors[i] = color;for (int adjPos : graph[i]){if (!setColor(graph, colors, adjPos, 1 - color))return false;}return true;
}

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

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

相关文章

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

chrome 浏览器 有自带的自动字幕功能,支持英文,控制您的音乐、视频等媒体内容

chrome 浏览器 有自带的自动字幕功能&#xff0c;支持英文&#xff0c;控制您的音乐、视频等媒体内容

【机器学习算法】决策树和随机森林在计算机视觉中的应用

前言 决策树和随机森林在计算机视觉中有着广泛的应用。决策树作为一种简单而强大的分类模型&#xff0c;可以用于图像分类、目标检测、特征提取等任务。它能够根据图像的特征逐层进行判断和分类&#xff0c;从而实现对图像数据的智能分析和理解。随机森林作为一种集成学习方法&…

[dvwa] CSRF

CSRF 0x01 low 跨站&#xff0c;输入密码和确认密码直接写在url中&#xff0c;将连接分享给目标&#xff0c;点击后修改密码 社工方式让目标点击短链接 伪造404页&#xff0c;在图片中写路径为payload&#xff0c;目标载入网页自动请求构造链接&#xff0c;目标被攻击 http…

【STL】栈(stack)

笔者在做下面这道题的时候想到用栈&#xff0c;但写的很麻烦 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define MAXC 255 typedef int SElemType; typedef struct StackNode {SElemType data;struct StackNode *next; }StackNode,*LinkStack; bool…

MathJax的基本使用

一、引言 MathJax引擎是一个开源的JavaScript库&#xff0c;它允许Web开发者在网页中嵌入高质量的数学公式。通过利用Web的最新技术&#xff0c;MathJax引擎可以解析LaTeX、MathML和AsciiMath等数学标记语言&#xff0c;并将其渲染为可视化的数学公式&#xff0c;这些公式可以…

NPU float(“inf“) mask_fill 出现NAN

使用NPU时&#xff0c;采用mask_fill函数&#xff0c;会出错&#xff1a; tensors.masked_fill(mask.unsqueeze(-1), float(inf)) 无法直接使用表达式,会报错 NAN&#xff1a; 取一个较大的值替换即可&#xff1b; tensors.masked_fill(mask.unsqueeze(-1), float(1e10))

LeetCode算法——双指针篇

宫侑的发球最终进化为三刀流&#xff0c;那么我的题解也未必要循规蹈矩! 1、验证回文串 题目描述&#xff1a; 解法&#xff1a; 这题官方给的关于双指针的题解都用到了多个库函数&#xff0c;如 tolower(大写字母转小写)、isalnum(判断一个字符是否是 字母 或者 十进制数字 )…

LeetCode——622设计循环队列

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/design-circular-queue/ 1.题目 设计你的循环队列实现。 循环队列是一…

CSS-文字环绕浮动、行内块分页、三角强化妙用、伪元素选择器

文字环绕浮动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文字环绕浮动效果</title><s…

Vue+el-table 修改表格 单元格横线边框颜色及表格空数据时边框颜色

需求 目前 找到对应的css样式进行修改 修改后 css样式 >>>.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F !important;}>>>.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf {border-bottom: 1px solid #444B5F …

Oracle ORA-28547:connection to server failed,probable Oracle Net admin error

使用Navicat连接oracle数据库时报ORA-28547错误 因为Navicat自带的oci.dll并不支持oracle11g&#xff0c;需要去官网下载支持的版本。 1.去oracle下载对应的oci.dll文件 下载地址&#xff1a;Oracle Instant Client Downloads 可以用 11.2.0.4 2. 复制刚下载下来的instant…

【智能算法】小龙虾优化算法(COA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;Jia等人受到自然界小龙虾社会行为启发&#xff0c;提出了小龙虾优化算法&#xff08;Crayfsh Optimization Algorithm, COA&#xff09;。 2.算法原理 2.1算法思想 COA基于小龙…

计算机网络-TCP连接建立阶段错误应对机制

错误现象 丢包 网络问题&#xff1a;网络不稳定可能导致丢包&#xff0c;例如信号弱或干扰强。带宽限制可能导致路由器或交换机丢弃包&#xff0c;尤其是在高流量时段。网络拥塞时&#xff0c;多个数据流竞争有限的资源&#xff0c;也可能导致丢包。缓冲区溢出&#xff1a;TC…

网络安全之代码签名证书申请

代码签名&#xff0c;作为一种数字安全机制&#xff0c;对于软件开发、分发及用户使用环节具有至关重要的意义。以下从六大方面阐述代码签名必不可少的重要性&#xff1a; 确保代码来源可信&#xff1a; 代码签名如同软件的“身份证”&#xff0c;通过数字证书对开发者身份进…

微信被拉黑删除的提示差异和检测方法

拉黑 被拉黑的提示是“消息已发出&#xff0c;但被对方拒收了”。 拉黑方能发消息且被拉黑方能接到&#xff0c;被拉黑的人无法发送成功&#xff0c;并灰色字提示。 删除 仅删除的时候&#xff0c;才能发送消息时不是提示拒收&#xff0c;可“发送朋友验证”添加&#xff0…

头歌-机器学习 第11次实验 softmax回归

第1关&#xff1a;softmax回归原理 任务描述 本关任务&#xff1a;使用Python实现softmax函数。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.softmax回归原理&#xff0c;2.softmax函数。 softmax回归原理 与逻辑回归一样&#xff0c;softmax回归同样…

【星戈瑞】DBCO-NH2在生物成像技术中的应用

DBCO-NH2作为一种生物标记分子&#xff0c;在生物成像技术中发挥诸多应用作用。其点击化学反应特性使得它能够在生物体内进行特异的标记&#xff0c;从而为生物医学研究提供工具。 在生物成像技术中&#xff0c;DBCO-NH2常被用于标记生物分子&#xff0c;如蛋白质、核酸等。通…

Android 9.0 framework层实现app默认全屏显示

1.前言 在9.0的系统rom产品定制化开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 fram…

【科研】搜索文献的网站

文章目录 paperswithcode【最新论文&#xff0c;代码】huggingface【大语言模型&#xff0c;最新论文】dblp【关键词搜索】arxiv【最新文章】semanticscholar【相关引用查询】connectedpapers【相关引用查询】github【工程&#xff0c;代码&#xff0c;论文开源代码】 paperswi…