面试经典150题——图

文章目录

  • 1、岛屿数量
    • 1.1 题目链接
    • 1.2 题目描述
    • 1.3 解题代码
    • 1.4 解题思路
  • 2、被围绕的区域
    • 2.1 题目链接
    • 2.2 题目描述
    • 2.3 解题代码
    • 2.4 解题思路
  • 3、克隆图
    • 3.1 题目链接
    • 3.2 题目描述
    • 3.3 解题代码
    • 3.4 解题思路
  • 4、除法求值
    • 4.1 题目链接
    • 4.2 题目描述
    • 4.3 解题代码
    • 4.4 解题思路
  • 5、课程表
    • 5.1 题目链接
    • 5.2 题目描述
    • 5.3 解题代码
    • 5.4 解题思路
  • 6、课程表 II
    • 6.1 题目链接
    • 6.2 题目描述
    • 6.3 解题代码
    • 6.4 解题思路


1、岛屿数量

1.1 题目链接

点击跳转到题目位置

1.2 题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 ‘0’ 或 ‘1’

1.3 解题代码

class Solution {int[][] dir = {{-1, 0},{1, 0},{0, 1},{0, -1},};public int numIslands(char[][] grid) {Map<Integer, Integer> hash = new HashMap<Integer, Integer>(); int m = grid.length;int n = grid[0].length;int ret = 0;Queue<Integer> q = new LinkedList();for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(grid[i][j] == '1' && !hash.containsKey(500 * i + j)){q.offer(500 * i + j);hash.put(500 * i + j, 1);++ret;}while(!q.isEmpty()){int num = q.peek();q.poll();int x = num / 500;int y = num % 500;for(int k = 0; k < 4; ++k){int tx = x + dir[k][0];int ty = y + dir[k][1];if(tx < 0 || tx >= m || ty < 0 || ty >= n || grid[tx][ty] == '0'){continue;}if(!hash.containsKey(tx * 500 + ty)){hash.put(tx * 500 + ty, 1);q.offer(tx * 500 + ty);}}}}}return ret;}
}

1.4 解题思路

  1. 使用广度优先搜索来解决问题。
  2. 广度优先搜索的核心思路为哈希+队列

2、被围绕的区域

2.1 题目链接

点击跳转到题目位置

2.2 题目描述

给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ 组成,捕获 所有 被围绕的区域:

  • **连接:**一个单元格与水平或垂直方向上相邻的单元格连接。
  • 区域:连接所有 ‘O’ 的单元格来形成一个区域。
  • **围绕:**如果您可以用 ‘X’ 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 ‘X’ 单元格围绕。

通过 原地 将输入矩阵中的所有 ‘O’ 替换为 ‘X’ 来 捕获被围绕的区域。你不需要返回任何值。

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j] 为 ‘X’ 或 ‘O’

2.3 解题代码

class Solution {int[][] dir = {{-1, 0},{1, 0},{0, -1},{0, 1},};Map<Integer, Integer> hash = new HashMap<Integer, Integer>();void bfs(char[][] board, int startX, int startY, int m, int n){Queue<Integer> q = new LinkedList();q.offer(startX * 500 + startY);hash.put(startX * 500 + startY, 1);while(!q.isEmpty()){int num = q.peek();q.poll();int x = num / 500;int y = num % 500;for(int k = 0; k < 4; ++k){int tx = x + dir[k][0];int ty = y + dir[k][1];if(tx < 0 || tx >= m || ty < 0 || ty >= n || board[tx][ty] == 'X'){continue;}if(!hash.containsKey(tx * 500 + ty)){hash.put(tx * 500 + ty, 1);q.offer(tx * 500 + ty);}}}}public void solve(char[][] board) {int m = board.length;int n = board[0].length;for(int i = 0; i < m; ++i){if(board[i][0] == 'O' && !hash.containsKey(i * 500 + 0)){bfs(board, i, 0, m, n);}if(board[i][n - 1] == 'O' && !hash.containsKey(i * 500 + n - 1)){bfs(board, i, n - 1, m, n);}}for(int j = 0; j < n; ++j){if(board[0][j] == 'O' && !hash.containsKey(0 * 500 + j)){bfs(board, 0, j, m, n);}if(board[m - 1][j] == 'O' && !hash.containsKey((m - 1) * 500 + j)){bfs(board, m - 1, j, m, n);}}for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(board[i][j] == 'O' && !hash.containsKey(i * 500 + j)){board[i][j] = 'X';}}}}
}

2.4 解题思路

  1. 广度优先搜索,首先先从地图边缘开始进行广搜,将所有与地图边缘连接且字符为’O’的点用哈希表标注起来
  2. 之后遍历地图,对所有字符为‘O’,并且哈希表中不存在的点转化成‘X’。

3、克隆图

3.1 题目链接

点击跳转到题目位置

3.2 题目描述

给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])
在这里插入图片描述
测试用例格式:

简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。

邻接列表 是用于表示有限图的无序列表的集合。每个列表都描述了图中节点的邻居集。

给定节点将始终是图中的第一个节点(值为 1)。你必须将 给定节点的拷贝 作为对克隆图的引用返回。

提示:

  • 这张图中的节点数在 [0, 100] 之间。
  • 1 <= Node.val <= 100
  • 每个节点值 Node.val 都是唯一的,
  • 图中没有重复的边,也没有自环。
  • 图是连通图,你可以从给定节点访问到所有节点。

3.3 解题代码

/*
// Definition for a Node.
class Node {public int val;public List<Node> neighbors;public Node() {val = 0;neighbors = new ArrayList<Node>();}public Node(int _val) {val = _val;neighbors = new ArrayList<Node>();}public Node(int _val, ArrayList<Node> _neighbors) {val = _val;neighbors = _neighbors;}
}
*/class Solution {Map<Node, Node> hash = new HashMap<Node, Node>();public Node cloneGraph(Node node) {if(node == null){return null;}if(!hash.containsKey(node)){Node newNode = new Node(node.val);hash.put(node, newNode);for(int i = 0; i < node.neighbors.size(); ++i){newNode.neighbors.add(cloneGraph(node.neighbors.get(i)));}}return hash.get(node);}
}

3.4 解题思路

  1. 递归求解即可,题目与之前的138. 随机链表的复制一致。

4、除法求值

4.1 题目链接

点击跳转到题目位置

4.2 题目描述

给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。

另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。

返回 所有问题的答案 。如果存在某个无法确定的答案,则用 -1.0 替代这个答案。如果问题中出现了给定的已知条件中没有出现的字符串,也需要用 -1.0 替代这个答案。

**注意:**输入总是有效的。你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果。

**注意:**未在等式列表中出现的变量是未定义的,因此无法确定它们的答案。

提示:

  • 1 <= equations.length <= 20
  • equations[i].length == 2
  • 1 <= Ai.length, Bi.length <= 5
  • values.length == equations.length
  • 0.0 < values[i] <= 20.0
  • 1 <= queries.length <= 20
  • queries[i].length == 2
  • 1 <= Cj.length, Dj.length <= 5
  • Ai, Bi, Cj, Dj 由小写英文字母与数字组成

4.3 解题代码

class Solution {Map<String, Integer> hash = new HashMap<String, Integer>();int find(List<Integer> pre, List<Double> weight, int x){if(x != pre.get(x)){int origin = pre.get(x);pre.set(x, find(pre, weight, pre.get(x))); weight.set(x, weight.get(x) * weight.get(origin));}return pre.get(x);}void union(List<Integer> pre, List<Double> weight, double value, int x, int y){int index1 = find(pre, weight, x);int index2 = find(pre, weight, y);if(index1 != index2){pre.set(index1, index2);weight.set(index1, weight.get(y) * value / weight.get(x)); }}public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {int equationsSize = equations.size();int queriesSize = queries.size();double[] res = new double[queriesSize];int id = 0;List<Integer> pre = new ArrayList<>();List<Double> weight = new ArrayList<Double>();for(int i = 0; i < equationsSize; ++i){String str1 = equations.get(i).get(0);String str2 = equations.get(i).get(1);if(!hash.containsKey(str1)){hash.put(str1, id);pre.add(id);weight.add(1.0d);id++;        }if(!hash.containsKey(str2)){hash.put(str2, id);pre.add(id);weight.add(1.0);id++;}union(pre, weight, values[i], hash.get(str1), hash.get(str2));}for(int i = 0; i < queriesSize; ++i){String str1 = queries.get(i).get(0);String str2 = queries.get(i).get(1);if(!hash.containsKey(str1) || !hash.containsKey(str2)){res[i] = -1.0;continue;}Integer id1 = hash.get(str1);Integer id2 = hash.get(str2);if(find(pre, weight, id1) != find(pre, weight, id2)){res[i] = -1.0d;continue;}double value1 = weight.get(id1);double value2 = weight.get(id2);res[i] = value1 / value2;}return res;}
}

4.4 解题思路

  1. 使用并查集解决问题。

5、课程表

5.1 题目链接

点击跳转到题目位置

5.2 题目描述

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程 bi

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同

5.3 解题代码

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> edge = new ArrayList<>();for (int i = 0; i < numCourses; ++i) {edge.add(new ArrayList<>());}int[] deg = new int[numCourses];int n = prerequisites.length;for(int i = 0; i < n; ++i){int x = prerequisites[i][0];int y = prerequisites[i][1];deg[x]++;edge.get(y).add(x);}Queue<Integer> q = new LinkedList<Integer>();for(int i = 0; i < numCourses; ++i){if(deg[i] == 0){q.offer(i);}}while(!q.isEmpty()){int x = q.peek();q.poll();numCourses--;for(int i = 0; i < edge.get(x).size(); ++i){int num = edge.get(x).get(i);deg[num]--;if(deg[num] == 0){q.offer(num);}}}return numCourses == 0;}
}

5.4 解题思路

  1. 使用拓扑排序来解决问题
  2. 每次将度为0的结点放入队列中,每次从队首取点,并且numCourses–。如果最后图中存在环的话,则numCourses则不为0。

6、课程表 II

6.1 题目链接

点击跳转到题目位置

6.2 题目描述

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai必须 先选修 bi

  • 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。

返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= numCourses * (numCourses - 1)
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • ai != bi
    所有[ai, bi] 互不相同

6.3 解题代码

class Solution {public int[] findOrder(int numCourses, int[][] prerequisites) {int[] res = new int[numCourses];int k = 0;List<List<Integer>> edge = new ArrayList<>();for (int i = 0; i < numCourses; ++i) {edge.add(new ArrayList<>());}int[] deg = new int[numCourses];int n = prerequisites.length;for(int i = 0; i < n; ++i){int x = prerequisites[i][0];int y = prerequisites[i][1];deg[x]++;edge.get(y).add(x);}Queue<Integer> q = new LinkedList<Integer>();for(int i = 0; i < numCourses; ++i){if(deg[i] == 0){q.offer(i);}}while(!q.isEmpty()){int x = q.peek();res[k++] = x;q.poll();numCourses--;for(int i = 0; i < edge.get(x).size(); ++i){int num = edge.get(x).get(i);deg[num]--;if(deg[num] == 0){q.offer(num);}}}if(numCourses == 0){return res;}return new int[0];}
}

6.4 解题思路

  1. 使用拓扑排序解题
  2. 与上一题的区别就是需要把每次队首的元素放入结果数组中,最后符合条件的输出结果数组,否则输出空数组。

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

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

相关文章

第25章 项目启航前的密谈

在那弥漫着严谨与专注气息的会议室里&#xff0c;苏睿所长端坐在会议桌前&#xff0c;宛如一座沉稳的山峰&#xff0c;散发着一种让人安心的力量。他的神情认真而庄重&#xff0c;目光中透着几分感慨&#xff0c;仿佛在时光的长河中回溯着项目的点点滴滴。微微侧身看向东方艾艾…

FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验

文章目录 FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下&#xff0c;好使。END FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…

npm cnpm pnpm npx yarn的区别

npm、cnpm、pnpm、npx、yarn 这几个工具都与 Node.js 项目的包管理和命令执行相关&#xff0c;它们的区别具体如下&#xff1a; 本质与功能定位 npm&#xff1a;是 Node.js 官方的包管理工具&#xff0c;提供了安装、卸载、更新、发布等全方位的包管理功能&#xff0c;还能通…

【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法

目录 ​编辑 ​编辑 1.Chapter 2 Why Linear Algebra? 2.Chapter 3 What Is a Vector? 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的…

为AI聊天工具添加一个知识系统 之76 详细设计之17 正则表达式 之4 正则表达式模板

Q712、三“化” &#xff08;使用三种不同的定义方法&#xff1a;规定定义法 -线性回归/内涵定义法--一阶迭代/外延定义法--单调递归&#xff09; 整体形成 一个双人零和 的局面 <Class()外延式, Type()内涵式> Method()规定式。给出 问题“law 是什么”的三种答案&#…

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…

Java 基于 SpringBoot 的校园外卖点餐平台微信小程序(附源码,部署,文档)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

作業系統:設計與實現-母本

2023 南京大學《作業系統:設計與實現》 課程主頁(含講義):https://jyywiki.cn/OS/2023/ 【Python 实现操作系统模型 [南京大学2023操作系统-P4] (蒋炎岩)-哔哩哔哩】 https://b23.tv/jakxDbh 用Python实现操作系统模型讲义 一、操作系统基础概念 1.1 定义 操作系统(Oper…

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…

2218. 从栈中取出 K 个硬币的最大面值和

2218. 从栈中取出 K 个硬币的最大面值和 题目链接&#xff1a;2218. 从栈中取出 K 个硬币的最大面值和 代码如下&#xff1a; class Solution { public:int maxValueOfCoins(vector<vector<int>>& piles, int k) {vector<vector<int>> memo(pile…

RTOS面试合集

目录 啥是RTOS 进程的状态 RTOS的调度 什么是时间片轮转调度&#xff1f; 如何实现基于优先级的抢占调度&#xff1f; 任务调度中的“时间窗”概念是什么&#xff1f; 任务和线程 如何在RTOS中创建和删除任务&#xff1f; 任务间如何共享数据&#xff1f; 如何管理任务…

AI学习指南Ollama篇-Ollama性能优化与监控

一、引言 (一)背景介绍 随着大语言模型(LLM)在本地部署中的广泛应用,性能优化和监控成为提升效率的关键。大语言模型通常对计算资源和内存有较高要求,而本地部署环境可能受到硬件资源的限制。因此,优化模型的性能并实时监控其运行状态,对于确保高效运行至关重要。 (…

知识体系、知识管理角度的赚钱思考

从知识管理和知识体系的角度出发&#xff0c;赚钱的问题思考清单可以帮助你系统地梳理和优化自己在财富创造方面的策略。 以下是一个详细的清单&#xff0c;涵盖从知识获取、技能提升到实际应用的各个环节&#xff0c;帮助你在赚钱的道路上更加高效和有条理。 一、赚钱的目标与…

LeetCode热题100(八)—— 438.找到字符串中所有字母异位词

LeetCode热题100&#xff08;八&#xff09;—— 438.找到字符串中所有字母异位词 题目描述代码实现思路解析 你好&#xff0c;我是杨十一&#xff0c;一名热爱健身的程序员在Coding的征程中&#xff0c;不断探索与成长LeetCode热题100——刷题记录&#xff08;不定期更新&…

八股——Java基础(四)

目录 一、泛型 1. Java中的泛型是什么 ? 2. 使用泛型的好处是什么? 3. Java泛型的原理是什么 ? 什么是类型擦除 ? 4.什么是泛型中的限定通配符和非限定通配符 ? 5. List和List 之间有什么区别 ? 6. 可以把List传递给一个接受List参数的方法吗&#xff1f; 7. Arra…

naivecv的设计与实现(2): 读写gray和rgb图像

图像读写并不是图像处理的核心&#xff0c;仅仅作为调试工具&#xff0c; 是一种手段而非目的。 图像文件格式的选择 正因如此&#xff0c;对gray和rgb图像的读写&#xff0c;存在多种方法。 最常见的三种图像文件格式&#xff1a; bmppngjpg 实际上有更简单的方式&#xf…

【llm对话系统】LLM 大模型Prompt 怎么写?

如果说 LLM 是一个强大的工具&#xff0c;那么 Prompt 就是使用这个工具的“说明书”。一份好的 Prompt 可以引导 LLM 生成更准确、更相关、更符合你期望的输出。 今天&#xff0c;我们就来聊聊 LLM Prompt 的编写技巧&#xff0c;掌握这把解锁 LLM 潜能的钥匙&#xff01; 一…

设计壁纸时,色彩选择是至关重要的一步

在设计壁纸时&#xff0c;色彩选择是至关重要的一步&#xff0c;它直接影响到壁纸的整体视觉效果和情感传达。以下是一些色彩选择的技巧&#xff0c;帮助你在设计中更好地运用色彩&#xff1a; 一、了解色彩理论 色彩轮&#xff1a; 基本颜色&#xff1a;红、黄、蓝是三原色&am…

Linux shell脚本笔记-One

前言 本文主要汇总有关shell脚本常用的知识点&#xff0c;有时候使用忘记某些用法指令&#xff0c;特此汇总方便后续查阅。 一.shell脚本编写的头部定义: 定义的shell脚本头部有多种写法&#xff0c;具体根基实际系统结构处理&#xff0c;如下: #!/bin/sh &#xff…

二次封装的方法

二次封装 我们开发中经常需要封装一些第三方组件&#xff0c;那么父组件应该怎么传值&#xff0c;怎么调用封装好的组件原有的属性、插槽、方法&#xff0c;一个个调用虽然可行&#xff0c;但十分麻烦&#xff0c;我们一起来看更简便的方法。 二次封装组件&#xff0c;属性怎…