NeeEk0 陪你一起算法登峰
文章平均质量分 94
总结了常见的笔试算法题,也适用于基础的算法竞赛。
NeeEk0
把复杂的事情变简单,把简单的事情重复做。
展开
-
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(上篇)
回溯算法是一种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从一个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的核心思想:“试错”,即在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索,否则,回退到上一个状态,重新做出选择。回溯算法通常用于解决具有多个解,且每个解都需要搜索才能找到的问题。// 回溯算法的模板。原创 2024-09-27 11:03:51 · 1413 阅读 · 1 评论 -
【算法】二叉树中的 DFS
二叉树是一种经典的树结构,是节点的一个有限集合(该集合为空,或由一个根节点加上两棵别称为左子树和右子树的二叉树组成)。二叉树中又有一些特别的类型,例如二叉搜索树、红黑树等。若根的左子树不为空,则左子树上所有节点的值都小于根节点的值;若根的右子树不为空,则右子树上所有节点的值都大于根节点的值;根的左右子树也分别为二叉搜索树。前序遍历:根->左子树->右子树。中序遍历:左子树->根->右子树。后序遍历:左子树->右子树->根。原创 2024-09-26 09:38:35 · 830 阅读 · 0 评论 -
【算法】递归
常见的、典型的搜索算法有 BFS(宽度优先搜索)和 DFS(深度优先搜索)。而递归是搜索算法的基础。如果将递归看作是一个大类,那么搜索算法就是递归下面的一个分支,因此要掌握搜索算法,就必须掌握递归。【Tips】递归是什么?简单来说,递归就是一个函数自己调用自己的行为。【Tips】为什么会用到递归?把一个问题看作是主要问题,这个主要问题可以划分为若干个相同的子问题,递归就主要针对这种场景。【Tips】如何理解递归?画递归展开的细节图(本质是对一棵树进行DFS);借助二叉树的相关题目;原创 2024-09-24 09:56:30 · 1190 阅读 · 1 评论 -
【算法】BFS系列之 拓扑排序
【补】图的基本概念(1)顶点集合V = {x|x属于某个数据对象集}是有穷非空集合;E = {(x,y)|x,y属于V}或者E = {|x,y属于V && Path(x, y)}是顶点间关系的有穷集合,也叫做边的集合。(x, y)表示x到y的一条双向通路,即(x, y)是无方向的;Path(x, y)表示从x到y的一条单向通路,即Path(x, y)是有方向的。顶点和边:图中结点称为顶点,第i个顶点记作vi。原创 2024-09-22 12:03:08 · 1081 阅读 · 4 评论 -
【算法】BFS 系列之 多源 BFS
最短路问题是图论中一种经典的题型,包括单源最短路、多源最短路、边权为 1 的最短路等等。本篇主要讲述的是边权为 1 的多源最短路问题。简单来说,边权为 1 的单源最短路问题即为:求从单个起点到终点的最短路径距离,而边权为 1 的多源最短路问题即为:求从多个起点到终点的最短路径距离。对于多源的最短路问题,我们将多个相邻的起点看作是一个整体,进而简化成一个起点,将多源转化成单源并利用 BFS 来处理,具体的方式是,在用队列进行 BFS 时,将所有起点入队,然后一层一层向外扩展。。原创 2024-09-20 11:17:06 · 1005 阅读 · 0 评论 -
【算法】BFS 系列之边权为 1 的最短路问题
最短路问题是图论中一种经典的题型,包括单源最短路、多源最短路、边权为 1 的最短路等等。本篇主要讲述的是边权为 1 的最短路问题。有如下一幅无向图,其中的每个点都可以看作是一个地点,两点之间的线可以看作是一条路径,路径上标识的权值(边权)可以看作是路径的长度,所谓最短路问题,就是求一个地点到另一个地点的最短路径长度。而边权为 1 的最短路问题,就是指每条路径上的权值都为 1 或都相同。原创 2024-09-19 11:55:18 · 1110 阅读 · 1 评论 -
【算法】BFS系列之 FloodFill 算法
FloodeFill算法即填充算法,原理就是从一个点开始向四周扩散,向周围可以走到的点填充颜色,直到将可扩散到的点全部填充颜色。BFS (宽搜)算法通常使用队列实现,将起始像素点加入队列中,并不断扩展队列中的像素点,直到队列为空为止。DFS(深搜) 算法通常使用递归实现,在处理当前像素点的相邻像素点时,递归调用 DFS 函数,不断深入直到无法找到相邻像素为止。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。原创 2024-09-18 11:47:31 · 1226 阅读 · 0 评论 -
【算法】堆与优先级队列
1046. 最后一块石头的重量。原创 2024-09-18 09:20:46 · 1106 阅读 · 0 评论 -
【算法】队列与BFS
和栈类似,队列也是一种特殊的线性数据结构,是只允许在一端进行插入数据操作、在另一端进行删除数据操作的特殊线性表,具有先进先出的特性。进行插入操作(入队)的一端称为队尾,进行删除操作(出队)的一端称为队头。队列一般与 BFS(宽度优先搜索)结合出题,而 BFS 主要的题型有树形结构相关(多为二叉树)、图论相关(最短路问题、迷宫问题、拓扑排序等)。原创 2024-09-16 10:32:15 · 858 阅读 · 2 评论 -
【算法】栈与模拟
栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出的原则。它的插入操作叫做进栈(或进栈/入栈),插入的数据在栈顶;删除操作叫做出栈。出的数据也在栈顶。栈一般与模拟算法结合在一起出题,在题目中野经常充当数据的缓存容器,来帮助模拟入栈和出栈的过程以求得结果。原创 2024-09-16 10:31:59 · 857 阅读 · 0 评论 -
【算法】哈希表相关
哈希表是一种存储数据的容器,可以快速查找某个元素,其查找的时间复杂度为 O(1),非常合适需要频繁查找某一个元素的场景。直接使用底层为哈希表的 STL 容器。用数组模拟简易的哈希表,例如利用数组统计字符串中字符的频次、整型的数据范围很小时映射某些值等。原创 2024-09-11 10:12:02 · 986 阅读 · 3 评论 -
【算法】链表相关
链表是一种常见的线性数据结构,是一种在物理结构上非连续、非顺序的存储结构,其中的数据元素的逻辑顺序由其中的指针链接次序实现,指针链接的每一个结构体都是一个节点。链表的结构多种多样,有单向或双向、带头或不带头、循环或非循环之分。无头单向非循环链表(或称单链表)带头双向循环链表(或称双向链表)【Tips】链表的常用技巧一定要画图!引入一个虚拟的头节点,利于处理边界情况、对链表进行各种操作。不要吝啬空间,大胆定义变量去使用,尤其涉及到插入操作的时候。原创 2024-09-11 10:10:54 · 724 阅读 · 0 评论 -
【算法】字符串相关
字符串是一种数据结构,大多与别的算法结合在一起出题,例如模拟、高精度算法、双指针、dp、回溯等,因此这个专题的题型本身是特别丰富的。本篇选取了较为典型的字符串题型,除了涵盖一些常用算法,还包括经常用到的容器、接口等。原创 2024-09-28 09:30:27 · 920 阅读 · 3 评论 -
【算法】分治 · 归并
与快速排序类似,归并排序也将无序数组进行划分,根据数组的中间位置,通过递归的方式依此将数组划分为两个区间,直到每个区间只有一个元素为止,然后在每一层递归对划分后的数组进行排序,最终递归层层返回,将若干个排好序的小区间合并起来,这样就完成了对无序数组的排序。原创 2024-09-09 16:30:34 · 1046 阅读 · 1 评论 -
【算法】分治 · 三路划分的快排
快速排序算法有很多版本,其中较为常见的有 hoare 法、挖坑法、前后指针法。这些版本已经在往期博客中做过详细的梳理(【算法】八种常见排序算法-CSDN博客),本篇则侧重于三路划分版本。三路划分,顾名思义就是把一个顺序数据结构(一般为数组)分成三个部分,在该数据结构中随机选定一个基准值作为 key,然后按元素的值把数组分成小于 key 的部分、等于 key 的部分、大于 key 的部分。此时,这个 key 是已经排好序的了,接下来只需继续对其他区间进行划分,直到整个数组完成排序。原创 2024-09-04 17:32:09 · 904 阅读 · 4 评论 -
【算法】位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的,位运算就是直接对整数在内存中的二进制位进行操作,常见有逻辑与(&)、逻辑或(|)、逻辑异或(^)、按位取反(~)等。【Tips】常见位运算方法总结(1)区分位运算的优先级:别人工区分了,按题目要求能加括号就加括号!(2)基础的与、或、异或(3)位图相关确定 n 的二进制数的第 x 位是 0 还是 1:右移 x 后与 1将 n 的二进制数的第 x 位修改成 1:或上 1 的左移 x。原创 2024-09-04 10:41:33 · 1096 阅读 · 4 评论 -
【算法】模拟
模拟算法是指,根据题目表述进行筛选提取关键要素,按需求书写代码解决实际问题,换句话说其实就是“依葫芦画瓢”,但很考察对数据结构、容器和一些特殊数学方法的掌握程度。模拟算法一般是一些很基础的题目,只要按题目要求来写代码就能解开题目。不过,模拟题也有相对困难的题目,而它们大部分的优化思路都是找规律。原创 2024-09-02 11:50:53 · 1055 阅读 · 0 评论 -
【算法】前缀和
前缀和是指,从数组的起始位置到某一位置的所有元素的和,主要应用于数组,有一维前缀和、二维前缀和之分,其本质是简易版的动态规划,使用时也会频繁涉及递推公式。【ps】做前缀和类型的题目,切忌死记硬背、生搬硬套,关键在于学会前缀和的思想和推导过程,能在不同的题目中化用。原创 2024-08-30 19:59:52 · 784 阅读 · 2 评论 -
【算法】二分查找
二分查找是一种高效的查找方法,其时间复杂度为 O(logN),主要针对于有序的顺序存储结构(无序有时也行,但是要有二段性),使用时的细节较多,但使用的套路相比其他算法更容易被摸清。34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)原创 2024-08-29 15:29:58 · 852 阅读 · 0 评论 -
【算法】滑动窗口
滑动窗口是一种常见的算法技巧,其本质由同向双指针构成,是双指针算法的变型,同样也适用于数组或字符串。在一个数组或字符串中,一前一后的同向双指针将数组或字符串进行了划分,被同向双指针包围的区间就像一个“窗口”,通过移动同向双指针就实现了“窗口”的“滑动”。【Tips】滑动窗口的一般解题步骤根据题目要求,定义和初始化同向双指针,以此初始化窗口的起始位置和结束位置;不断移动窗口,让窗口外的元素进窗口;根据题目要求,不断进行判断是否更新解,或是否出窗口;原创 2024-08-28 17:05:42 · 1216 阅读 · 0 评论 -
【算法】双指针
双指针(或多指针)是一种针对于线性结构的方法,适用于任何包含顺序存储的线性数据结构中,通过分别控制位于序列不同位置的两个指针,在序列中的移动,逐步简化待解决问题,以求解问题或满足特定条件。原创 2024-08-27 18:46:29 · 792 阅读 · 0 评论 -
【算法】八种常见排序算法
所谓排序,就是一种使一串数据记录,按照其中的某个或某些关键字的大小,递增或递减地组织起来的操作。 从数据的存储上,它被分为内部排序和外部排序。内部排序,是数据元素全部放在内存中的排序。 外部排序,是数据元素太多的时候不能同时放在内存中,根据排序过程的要求又不能在内外存之间移动数据的排序。 稳定性是排序最重要的评价方式。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排原创 2023-09-04 21:37:18 · 1819 阅读 · 1 评论