![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
优选算法
文章平均质量分 71
一些普通常见的算法介绍和例题
我要满血复活
厦门大学计算机科学与技术学生,简单记录学习路程
展开
-
双指针算法
常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。对撞指针:⼀般⽤于顺序结构中,也称左右指针。对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:(两个指针指向同⼀个位置)(两个指针错开)快慢指针:⼜称为⻳兔赛跑算法,其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列结构上移动。这种⽅法对于处理环形链表或数组⾮常有⽤。原创 2024-03-16 11:32:53 · 817 阅读 · 1 评论 -
滑动窗口算法
解法⼆(滑动窗⼝):算法思路:让滑动窗⼝满⾜:从i位置开始,窗⼝内所有元素的和⼩于target(那么当窗⼝内元素之和第⼀次⼤于等于⽬标值的时候,就是i位置开始,满⾜条件的最⼩⻓度)。做法:将右端元素划⼊窗⼝中,统计出此时窗⼝内元素的和:如果窗⼝内元素之和⼤于等于target:更新结果,并且将左端元素划出去的同时继续判断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)如果窗⼝内元素之和不满⾜条件:right++,另下⼀个元素进⼊窗⼝。原创 2024-03-16 16:36:57 · 960 阅读 · 1 评论 -
前缀和算法
解法(前缀和):算法思路:a.先预处理出来⼀个「前缀和」数组:⽤dp[i]表⽰:[1, i]区间内所有元素的和,那么dp[i - 1]⾥⾯存的就是[1, i - 1] 区间内所有元素的和,那么:可得递推公式: dp[i] = dp[i - 1] + arr[i];b.使⽤前缀和数组,「快速」求出「某⼀个区间内」所有元素的和:当询问的区间是 [l, r]时:区间内所有元素的和为:。原创 2024-03-23 18:46:05 · 680 阅读 · 1 评论 -
二分查找算法
3.算法思路:⽤的还是⼆分思想,就是根据数据的性质,在某种判断条件下将区间⼀分为⼆,然后舍去其中⼀个区间,然后再另⼀个区间内查找;⽅便叙述,⽤x表⽰该元素,resLeft表⽰左边界,resRight 表⽰右边界。寻找左边界思路:◦我们注意到以左边界划分的两个区间的特点:▪左边区间 [left, resLeft - 1]都是⼩于x的;▪右边区间(包括左边界) [resLeft, right]都是⼤于等于 x的;•因此,关于 mid的落点,我们可以分为下⾯两种情况:◦。原创 2024-03-16 17:33:04 · 841 阅读 · 1 评论 -
分治——快速排序算法
解法(快排思想 - 三指针法使数组分三块):算法思路:类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分三块。设数组⼤⼩为n,定义三个指针◦left :⽤来标记0序列的末尾,因此初始化为-1;◦cur :⽤来扫描数组,初始化为0;◦right :⽤来标记2序列的起始位置,因此初始化为n。在 cur 往后扫描的过程中,保证:◦[0, left] 内的元素都是0;◦[left + 1, cur - 1] 内的元素都是。原创 2024-03-26 22:36:43 · 949 阅读 · 0 评论 -
分治——归并排序算法
解法(归并排序):算法思路:归并排序的流程充分的体现了「分⽽治之」的思想,⼤体过程分为两步:◦分:将数组⼀分为⼆为两部分,⼀直分解到数组的⻓度为 1,使整个数组的排序过程被分为「左半部分排序」 + 「右半部分排序」;◦治:将两个较短的「有序数组合并成⼀个⻓的有序数组」,⼀直合并到最初的⻓度。原创 2024-03-31 17:35:15 · 908 阅读 · 1 评论 -
有关哈希表算法
解法(哈希表):算法思路:•如果我们可以事先将「数组内的元素」和「下标」绑定在⼀起存⼊「哈希表」中,然后直接在哈希表中查找每⼀个元素的 target - nums[i],就能快速的找到「⽬标和的下标」。•这⾥有⼀个⼩技巧,我们可以不⽤将元素全部放⼊到哈希表之后,再来⼆次遍历(因为要处理元素相同的情况)。⽽是在将元素放⼊到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的⽬标元素(即 target - nums[i]如果它存在,那我们已经找到了对应解,并⽴即将其返回。原创 2024-04-05 15:19:08 · 1054 阅读 · 0 评论 -
有关字符串算法
解法:算法思路(两两⽐较):我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀。原创 2024-04-05 19:52:06 · 306 阅读 · 0 评论 -
有关链表算法
解法(模拟):算法思路:两个链表都是逆序存储数字的,即两个链表的个位数、⼗位数等都已经对应,可以直接相加。在相加过程中,我们要注意是否产⽣进位,产⽣进位时需要将进位和链表数字⼀同相加。如果产⽣进位的位置在链表尾部,即答案位数⽐原链表位数⻓⼀位,还需要再 new⼀个结点储存最⾼位。原创 2024-04-02 21:24:45 · 436 阅读 · 0 评论 -
有关栈的算法
解法(栈):算法思路:本题极像我们玩过的「开⼼消消乐」游戏,仔细观察消除过程,可以发现本题与我们之前做过的「括号匹配」问题是类似的。当前元素是否被消除,需要知道上⼀个元素的信息,因此可以⽤「栈」来保存信息。但是,如果使⽤ stack来保存的话,最后还需要把结果从栈中取出来。不如直接⽤「数组模拟⼀个栈」结构:在数组的尾部「尾插尾删」,实现栈的「进栈」和「出栈」。那么最后数组存留的内容,就是最后的结果。原创 2024-04-05 22:19:55 · 475 阅读 · 0 评论 -
位运算算法
解法(位图的思想):算法思路:利⽤「位图」的思想,每⼀个「⽐特位」代表⼀个「字符,⼀个int类型的变量的32位⾜够表⽰所有的⼩写字⺟。⽐特位⾥⾯如果是0,表⽰这个字符没有出现过。⽐特位⾥⾯的值是1表⽰该字符出现过。那么我们就可以⽤⼀个「整数」来充当「哈希表」。原创 2024-03-20 20:46:25 · 223 阅读 · 1 评论 -
优先级队列(堆)
解法(利⽤堆):算法思路:其实就是⼀个模拟的过程:•每次从⽯堆中拿出最⼤的元素以及次⼤的元素,然后将它们粉碎;•如果还有剩余,就将剩余的⽯头继续放在原始的⽯堆⾥⾯。重复上⾯的操作,直到⽯堆⾥⾯只剩下⼀个元素,或者没有元素(因为所有的⽯头可能全部抵消了)那么主要的问题就是解决:•如何顺利的拿出最⼤的⽯头以及次⼤的⽯头;•并且将粉碎后的⽯头放⼊⽯堆中之后,也能快速找到下⼀轮粉碎的最⼤⽯头和次⼤⽯头;这不正好可以利⽤堆的特性来实现嘛?•我们可以创建⼀个⼤根堆;•。原创 2024-06-19 09:46:52 · 918 阅读 · 0 评论 -
队列 + 宽搜(BFS)
解法:算法思路:层序遍历即可~ 仅需多加⼀个变量,⽤来记录每⼀层结点的个数就好了。原创 2024-06-17 15:50:16 · 551 阅读 · 0 评论 -
BFS 解决 FloodFill 算法
算法思路:可以利⽤「深搜」或者「宽搜」,遍历到与该点相连的所有「像素相同的点」,然后将其修改成指定的像素即可。原创 2024-06-21 00:07:15 · 274 阅读 · 0 评论 -
BFS 解决最短路问题
解法(bfs 求最短路):算法思路:利⽤层序遍历来解决迷宫问题,是最经典的做法。我们可以从起点开始层序遍历,并且在遍历的过程中记录当前遍历的层数。这样就能在找到出⼝的时候,得到起点到出⼝的最短距离。原创 2024-06-22 17:19:30 · 191 阅读 · 0 评论 -
多源 BFS
解法(bfs)(多个源头的最短路问题)算法思路:对于求的最终结果,我们有两种⽅式:•第⼀种⽅式:从每⼀个1开始,然后通过层序遍历找到离它最近的0。这⼀种⽅式,我们会以所有的1起点,来⼀次层序遍历,势必会遍历到很多重复的点。并且如果矩阵中只有⼀个0的话,每⼀次层序遍历都要遍历很多层,时间复杂度较⾼。•换⼀种⽅式:从0开始层序遍历,并且记录遍历的层数。当第⼀次碰到1的时候,当前的层数就是这个1离0的最短距离。这⼀种⽅式,我们在遍历的时候标记⼀下处理过的1。原创 2024-06-24 12:03:23 · 272 阅读 · 0 评论 -
BFS 解决拓扑排序
解法:算法思路:原问题可以转换成⼀个拓扑排序问题。⽤ BFS 解决拓扑排序即可。拓扑排序流程:a.将所有⼊度为 0 的点加⼊到队列中;b.当队列不空的时候,⼀直循环:i.取出队头元素;ii.将于队头元素相连的顶点的⼊度 - 1;iii.然后判断是否减成 0,。如果减成 0,就加⼊到队列中。原创 2024-06-27 11:14:01 · 272 阅读 · 0 评论