程序员面试金典 - 面试题 04.01. 节点间通路(图的遍历)
1. 题目
节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
示例1:输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]],start = 0, target = 2输出:true
示例2:输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4输出 true提示:
节点数量n在[0, 1e5]范围内。
节点编号大于等于 0 小于 n。
图中可能存在自环和平行边。
2. 解题
- 邻接矩阵 内存超限
class Solution {public:bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {bool visited[n] = {false};visited[start] = true;queue<int> q;int tp, i;q.push(start);vector<vector<int>> map(n,vector<int>(n,0));for(i = 0; i < graph.size(); ++i)map[graph[i][0]][graph[i][1]] = 1;while(!q.empty()){tp = q.front();q.pop();if(tp == target)return true;for(i = 0; i < n; ++i){if(!visited[i] && map[tp][i]==1){visited[i] = true;q.push(i);}}}return false;}
};
- 邻接表 BFS
class Solution {public:bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {bool visited[n] = {false};visited[start] = true;vector<vector<int>> map(n);int i, tp;for(i = 0; i < graph.size(); ++i){map[graph[i][0]].push_back(graph[i][1]);}queue<int> q;q.push(start);while(!q.empty()){tp = q.front();if(tp == target)return true;q.pop();for(i = 0; i < map[tp].size(); ++i){if(!visited[map[tp][i]]){q.push(map[tp][i]);visited[map[tp][i]] = true;}}}return false;}
};
- 邻接表 DFS
class Solution {public:bool findWhetherExistsPath(int n, vector<vector<int>>& graph, int start, int target) {bool visited[n] = {false};visited[start] = true;vector<vector<int>> map(n);for(int i = 0; i < graph.size(); ++i){map[graph[i][0]].push_back(graph[i][1]);}bool found = false;dfs(map,start,target,found,visited);return found;}void dfs(vector<vector<int>>& map , int start, int& target, bool& found, bool* visited){if(start == target)found = true;if(found)return;for(int i = 0; i < map[start].size(); ++i){if(!visited[map[start][i]]){visited[map[start][i]] = true;dfs(map,map[start][i],target,found,visited);visited[map[start][i]] = false;}}}
};
程序员面试金典 - 面试题 04.01. 节点间通路(图的遍历)相关推荐
- 程序员面试金典 - 面试题 04.06. 后继者(循环中序遍历)
1. 题目 设计一个算法,找出二叉搜索树中指定节点的"下一个"节点(也即中序后继). 如果指定节点没有对应的"下一个"节点,则返回null. 示例 1: 输入: ...
- 面试题 04.01. 节点间通路
面试题 04.01. 节点间通路 注意是有向图,用邻接表代替图,dfs或者bfs都可 class Solution { public:bool findWhetherExistsPath(int n, ...
- 程序员面试金典 - 面试题 04.09. 二叉搜索树序列(双端队列+回溯)**
1. 题目 从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树. 给定一个由不同节点组成的二叉树,输出所有可能生成此树的数组. 示例: 给定如下二叉树2/ \1 3 返回: ...
- 程序员面试金典 - 面试题 05.01. 插入(位运算)
1. 题目 插入.给定两个32位的整数 N 与 M,以及表示比特位置的 i 与 j. 编写一种方法,将 M 插入 N,使得 M 从 N 的第 j 位开始,到第 i 位结束. 假定从 j 位到 i 位足 ...
- 程序员面试金典 - 面试题 04.12. 求和路径(二叉树递归)
1. 题目 给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负). 设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量. 注意,路径不一定非得从二叉树的根节点或叶节点开始或结束,但 ...
- 程序员面试金典 - 面试题 04.10. 检查子树(双重递归)
1. 题目 检查子树.你有两棵非常大的二叉树:T1,有几万个节点:T2,有几万个节点. 设计一个算法,判断 T2 是否为 T1 的子树. 如果 T1 有这么一个节点 n,其子树与 T2 一模一样,则 ...
- 程序员面试金典 - 面试题 04.05. 合法二叉搜索树(中序遍历)
1. 题目 实现一个函数,检查一棵二叉树是否为二叉搜索树. 示例 1: 输入:2/ \1 3 输出: true示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5, ...
- 程序员面试金典 - 面试题 04.04. 检查平衡性(二叉树高度)
1. 题目 实现一个函数,检查二叉树是否平衡.在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1. 示例 1: 给定二叉树 [3,9,20,null,null,15,7]3/ ...
- 程序员面试金典 - 面试题 04.03. 特定深度节点链表(BFS)
1. 题目 给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表).返回一个包含所有深度的链表的数组. 例: 输入:[1,2,3,4,5, ...
最新文章
- 微信公众号开发的一些配置
- 调试JDK源码-HashSet实现原理
- 硬核!OSPF路由协议归纳大全~
- 活动助手Beta用户试用报告
- 多线程:三大不安全案例
- 《上海堡垒》改编电影发布 QQ阅读披露作者江南心声
- Adaboost、RandomFrest、GBRT的区别
- CentOS6.6下搭建vsftpd+PAM认证
- 一键自动下载百度美女图片
- 韦东山之学习笔记——NOR Flash
- Python3 插入排序
- 去追寻,趁我们还年轻。
- 使用小波包变换分析信号的matlab程序,使用小波包变换分析信号的MATLAB程序
- 关于opencv fitLine直线拟合得斜率及截距
- centos英文版下如何安装中文语言包
- ArcGIS栅格按照象元大小生成矢量的方法
- POJ1837 DP
- Google Filament 源码学习(二):Material System (一)
- 黑客帝国代码雨JS,支持中文
- qq营销软件 服务器 虚拟机,QQ营销软件哪个好