BFS 到 Level Order traverse 到 UnionFind 到 Topological Sort 到 Dijkstra 思路总结

本文主要是介绍BFS 到 Level Order traverse 到 UnionFind 到 Topological Sort 到 Dijkstra 思路总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

====BFS 找联通量,找component.

Number of Islands (BFS, DFS 都可以做)

Surrounded Regions 算法是:先收集四个周边的 O,然后用BFS或者DFS向里面扩展,visited记录connect点,最后如果没有被visited到的O,会变成X;T: O(m*n), Space: O(m*n).

Is Graph Bipartite (用两个color来表示,1 -1, 同时注意可能有多个component,那么必须以for循环来判断每个点,for里面做BFS来标记颜色,这样就相当于用了visite hashset,所以这里就避免了用hashset来判断重复选点)

Clone Graph (BFS, DFS都可以做)

Reconstruction itinerary (DFS + PriorityQueue 来生成path)

====Union Find 找联通量是最合适的方法:对于动态加入的时候,尤其有效果;

Number of Connected Components in an Undirected Graph (BFS,  DFS, Union Find 都可以做)

Graph Valid Tree (BFS, Union Find 都可以做) BFS做的时候,一定要判断edge == nodes - 1, 收集到的node数量是n;

Union Find 题型总结

=====Level Order minimum distance 都会用到层级关系;

int size = queue.size(); for(int i = 0; i < size; i++);

Binary Tree Level Order Traversal

Binary Tree Level Order Traversal II

Binary Tree Zigzag Level Order Traversal

Binary Tree Vertical Order Traversal (用两个queue,一个收集node,一个收集col的index,min max收集最小col和最大col);

Binary Tree Right Side View (收集level的最后一个元素即可)

Find Largest Value in Each Tree Row

Shortest Path in a Grid with Obstacles Elimination (一层一层的走,走到最右下角,就是step数最小的, visited需要表示三维的,因为到x,y我可以以好几种方式到达,也就是不remove 1,和remove多个1之后到达,虽然坐标一样,但是状态是不一样的;)

The Maze (球选择一个方向,然后一直走到头,中间的0,不代表能够到达,只有最后一个node才算到达;走的过程就是一个while循环,一直走,技巧就是while(isvalid(maz, nx + dx[k], ny + dy[k]) 这里注意一点就是走的过程中并不需要判断是否visited过,while循环判断下一个点是否合法,不合法跳出循环,但是当前的点是合法的。走到碰墙了,才判断是否visited过。)

N-ary 题目归类总结

==== Tree Traverse, (preorder, Inorder, postorder) 总结

Serialize and Deserialize BST (用queue来做,O(n); 就是传参的时候用Integer.MIN_VALUE 和Integer.MAX_VALUE来作为下限和上限;只serialize有value的node,不管null node;这样如果value不在lower, upper范围之内,那么就是return null;)

Serialize and Deserialize Binary Tree  (用preorder traverse,current,left, right来serialize,然后用queue来deserilize,这题跟BST不同的是,这里需要serilize NULL,因为BST有大小关系,这里没有,所以需要满树才行;而且这里就不需要Integer.MAX_VALUE和Integer.MIN_VALUE作为参数来判断是否return null了,这个复杂度是O(N);)

====== minimum distance ====== 层级关系;

int size = queue.size(); for(int i = 0; i < size; i++);

Walls and Gates

Rotting Oranges 注意到空层的时候,step也加1了,最后return的时候需要减去1;

Word Ladder (BFS, 注意分层,还有刚开始不需要加入beginWord, endWord到dict中,相信自己的思维)

Word Ladder II, 求word ladder I 的所有路径;

Remove Invalid Parentheses (这题正确的解法还是收集invalid 左括号和右括号的数量,然后只去remove左括号和右括号的数量的)

Perfect Squares (这题可以BFS, DP两种做法) BFS就是减去j * j <= n的数,然后层级收集下一层的数,如果到0了,return step即可。DP 很像 coin change. 

All Nodes Distance K in Binary Tree (先把tree转换成graph,注意parent也是neighbor,然后在图上面做BFS);

=====Topological Sort 总结=====

Course Schedule (标准 Topological 的写法);

Course Schedule II (跟上面一样,只是记录topo的顺序到结果即可)

Course Schedule III (属于Greedy, 参考 Greedy 总结)

Minimum Height Trees (topo排序,一层一层的扒掉最外面的一层的node,返回最里面一层的node,注意n == 1,return list of {0};)

题目类似的还有个叫Minimum Spanning Tree, minimum cost to connect city; 做法是首先按照cost sort connection,然后用Union Find判断两个city是否相连,因为每次都是用最小的cost,所以最后结果就是最小的总cost;

Alien Dictionary 思路,就是拓扑排序,从单词之间的关系来得到图的关系,然后用hashmap来建立图。注意分函数写程序,这样清晰,而且容易debug;注意indegree需要把每个node全部赋值为0;然后再进行+1;注意所有的char都是一个node,都是字母;

这题有个特列:abc, ab, return  ""; 就是前面的相等,return "";

Longest Increasing Path in a Matrix 用topo排序来做,也就是 node 指向比自己小的点,那么小的点indegree就加1,那么刚开始就是从最大的点开始走,indegree是0,那么所有的最大的点同时开始走,也就是层级的关系,那么最长的steps就是最长的length;T: O(M*N), space: O(M*N); 这题虽然归类到topo排序,但是记忆化搜索更简单易懂;

Topological sort 总结

====Dijkstra 算法总结=====

Pacific Atlantic Water Flow  思路:用两个boolean矩阵来表示,水往里面走,往高的地势走,看能流向哪里,这样可以减少计算;同时最后两个矩阵重合的地方,就是overlap point which can flow to both side;

Cheapest Flights Within K Stops  思路:核心思想就是,每次走最小的cost的路径,那么到达des的时候,就是最小的cost,那么我们需要做的是把边cost的信息,融入到node里面去,那么node进行排序,也就是cost进行排序;graph怎么建立,graph: HashMap<Integer, HashMap<Integer, Integer>>  存 from , <neighbor, cost>将边的信息(cost信息),整合到node里面去,也就是到达这个city需要的cost是多少,然后剩下的步骤是多少,cost是累加的,剩下的步骤是减少的。pq: 存Node  Node<cost, city, step> sort by cost; 搜索:if( step > 0) 继续,if city = dst 表示找到,直接返回当前cost;Time: O(V + ElogE) Space: O(E)

Trapping Rain Water II 思路:一个格子能够盛水的高度,取决于这个格子四个方向能够传进来吃水线的最小值;用priorityqueue,最外围的格子是不能装水的,然后从最小的吃水线往里面渗透,因为每次都是以最小的吃水线往里面传递,那么保证了每次算出来的吃水线-height都是合法的盛水的高度;n*m*log(n*m)

这篇关于BFS 到 Level Order traverse 到 UnionFind 到 Topological Sort 到 Dijkstra 思路总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo