算法
文章平均质量分 86
对面试当中的算法进行总结归纳,并列出部分典型题,方便理解和回顾。
KuoGavin
这个作者很懒,什么都没留下…
展开
-
树的直径概念及求解
树上任意两节点之间最长的简单路径即为树的「直径」。显然,一棵树可以有多条直径,他们的长度相等。可以用两次 DFS/BFS 或者树形 DP 的方法在 O(n) 时间求出树的直径。原创 2023-03-13 19:26:52 · 1605 阅读 · 0 评论 -
堆排序(HeapSort)
文章目录1. 堆的概念2. 堆的实例3. 堆排过程3.1 堆排思想3.2 堆排过程示意3.3 堆排代码实现4. 复杂度分析1. 堆的概念堆的数据结构也即是个顺序存储的完全二叉树。在STL容器当中的实现为priority_queuepriority\_queuepriority_queue,即优先队列。之前左神的视频中已经讲过,昨日腾讯音乐一面要求写堆排序,时间比较久远且当时的代码也比较复杂。因此,在这里重新整理一下。之前的实现方法见:排序归纳总结(插入排序、归并排序、堆排序、快速排序、桶排序)——原创 2021-08-20 12:40:04 · 498 阅读 · 0 评论 -
有序数组二分查找模板
文章目录二分查找基础① 查找某一个数② 最后的小于目标值target的数③ 最后的小于等于目标值target的数,即右边界④ 第一个大于目标值target的数⑤ 第一个大于等于目标值target的数,即左边界二分查找基础二分本质上是对边界进行二分,将查找范围缩小为原先的一半。查找有序数组中,会有如下相关的子问题可以运用二分进行解决:① 查找某一个数;② 最后一个小于目标值target的数;③ 最后一个小于等于目标值target的数;④ 第一个大于目标值target的数;⑤ 第一个大于等于原创 2021-08-05 16:05:57 · 223 阅读 · 0 评论 -
背包问题汇总(模板,思路,LC例题)
背包问题是动态规划非常重要的一类问题,它有很多变种,但题目千变万化都离不开我根据力扣上背包问题的题解和一些大佬的经验总结的解题模板。文章目录1. 背包定义2. 背包问题解题模板2.1 分类解题模板2.2 LC相关例题相关内容:DFS+剪枝、DP(完全背包)、BFS:零钱兑换,是零钱兑换的题解。1. 背包定义那么什么样的问题可以被称作为背包问题?换言之,我们拿到题目如何透过题目的不同包装形式看到里面背包问题的不变内核呢?我对背包问题定义的理解:给定一个背包容量target,再给定一个数组nu原创 2021-07-29 08:38:53 · 824 阅读 · 0 评论 -
NowCoder大数乘法
NC10 大数乘法描述以字符串的形式读入两个数字,编写一个函数计算它们的乘积,以字符串形式返回。(字符串长度不大于10000,保证字符串仅由’0’~'9’这10种字符组成)示例1输入:"11","99"返回值:"1089"说明:11*99=1089 代码实现以12*99为例:处理进位:最终结果1188。class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 *原创 2021-07-26 15:54:16 · 244 阅读 · 0 评论 -
链表的快速排序和归并排序
不同于数组快排和归并排序(见排序归纳总结(插入排序、归并排序、堆排序、快速排序、桶排序)),链表不能够随机访问,只能从链表头遍历至链表尾,针对这一特性,需要对数组的排序算法做相应的调整。文章目录1. 快速排序2. 归并排序1. 快速排序对于链表的快速排序,使用两个指针p和q,使得p和q都只向其next方向进行遍历,同时保证p之前的链表节点的val都小于head的val值,p和q之间的链表节点的val都大于head的val值,则当q遍历到链表末尾时,再将head的val和p的val值进行互换,则就进行原创 2021-07-26 10:09:38 · 2481 阅读 · 0 评论 -
Floyd算法:多源汇最短路
文章目录Floyd算法yxc的图最短路问题算法图镇楼:单源最短路所有边权为正:Dijkstra:正边权单源最短路算法;单源最短路存在负权边:Bellman_Ford和SPFA:带负边权的单源最短路算法;多源汇最短路:Floyd算法:多源汇最短路;Floyd算法Floyd 属于多源最短路径算法,能够求出任意2个顶点之间的最短路径,支持负权边。算法原理:(1) 从任意顶点 i 到任意顶点 j 的最短路径不外乎两种可能 ① 直接从 i 到 j; ② 从 i 经过若干个顶点到 j;原创 2021-07-06 19:40:14 · 579 阅读 · 2 评论 -
Bellman_Ford和SPFA:带负边权的单源最短路算法
文章目录Bellman_Ford算法SPFA算法yxc的图最短路问题算法图镇楼:Bellman_Ford算法初始化所有点到源点的距离为∞\infty∞,把源点到自己的距离设置为 000;不管三七二十一遍历 nnn 次;每次遍历 mmm 条边,用每一条边去更新各点到源点的距离;由以上的算法实现思路,可得出Bellman_Ford算法的时间复杂度为 O(mn)O(mn)O(mn);需要注意的点:需要把dist数组进行一个备份backup,这样防止每次更新的时候出现串联;由于存在负权边原创 2021-07-06 17:36:11 · 388 阅读 · 2 评论 -
图的遍历(DFS,BFS,Topology Sort)
文章目录1. 图的存储结构2. 图的遍历2.1 图的DFS遍历2.2 图的BFS遍历3. 图的拓扑排序1. 图的存储结构对于稠密图,使用邻接矩阵进行存储和表示。邻接矩阵即二维数组,数组中的每个元素分别表示一有向边的边权值,在实际使用时,我们在初始化时先按照字节设置为无穷大∞\infty∞,实际使用memset()函数字节填充0x3f,为何使用该值见:编程中将无穷大常量的设定为0x3f3f3f3f。常用模板为:#include <cstring> //为了使用memset()函数#原创 2021-07-06 10:36:04 · 275 阅读 · 0 评论 -
Dijkstra:正边权单源最短路算法
Dijkstra算法的原理见:有权图的单源最短路算法(Dijkstra算法)文章目录朴素Dijkstra算法的实现堆优化的Dijkstra算法的实现朴素Dijkstra算法的实现AcWing题目见:849. Dijkstra求最短路 I,该算法的时间复杂度为O(n)O(n)O(n),整个的大循环为nnn,同时每次循环当中:寻找剩下(未决)的图的点集中dist[i]dist[i]dist[i]的最小的点花费时间为nnn;将st[i]st[i]st[i]设置为true,即标记已经解决的时间为11原创 2021-07-06 00:06:39 · 352 阅读 · 1 评论 -
力扣DFS题目汇总
39. 组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[ [7], [2,2,3]]示例 2:输入:candidates = [2,3,5]原创 2021-07-03 15:37:24 · 693 阅读 · 0 评论 -
最长不含重复字符的子字符串(滑动窗口/双指针,动态规划)
剑指 Offer 48. 最长不含重复字符的子字符串题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。思路: 长度为NNN的字符串共有(1+N)N2\frac{(1 + N)N}{2}2(1+N)N个子字符串(复杂度为 O(N2)O(N^2)O(N2) ),判断长度为NNN的字符串是否有重复字符的复杂度为O(N)O(N)O(N) ,因此本题使用暴力法解决的复杂度为O(N3)O(N^3)O(N3)。★1.滑动窗口/双指针解法 题目中要求答案必须是子串的长度,原创 2021-01-19 20:19:02 · 1506 阅读 · 0 评论 -
刷题输入输出方式&cin输入用法详解
文章目录0. cin输入原理1. cin>>2. cin.get()0. cin输入原理程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。注意:cin>>和cin.get()读残留数据不会出错,但cin.getline()会报错,下面的示例中都有体现原创 2021-06-18 10:53:28 · 777 阅读 · 0 评论 -
启发式算法(Heuristic Algorithm)
在学习CSAPP虚拟内存章节中,针对外部碎片的优化使用启发式算法试图维持少量的大空闲块,而非维持大量的小空闲块(p592)。在知乎上看到了启发式算法的阐释,记录如下:@辉太郎:利用类似仿生学的原理,将自然、动物中的一些现象抽象成为算法处理相应问题。当一个问题是NP难问题时,是无法求解到最优解的,因此,用一种相对好的求解算法,去尽可能逼近最优解,得到一个相对优解,在很多实际情况中也是可以接受的。@Dr.h:启发式搜索算法蕴含着许多人生哲学,它虽不是数学方法,其思想更类似于人类解决问题的思想和一些人生中总原创 2021-05-29 11:40:29 · 634 阅读 · 0 评论 -
动态规划思想、要素、分类
基本思想 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中, 可能会有很多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解问题分解为若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适用于动态规划算法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算很多次。如果我们能保存已解决子问题的答案,而在需要时再找出已求得的答案,这样原创 2021-02-28 19:09:05 · 217 阅读 · 0 评论 -
DFS+剪枝、DP(完全背包)、BFS:零钱兑换
LeetCode 322. 零钱兑换这道题是综合性特别强的一个问题,在初次写的时候没多想,立马就暴力DFS,之后加了剪枝改进,才通过;之后看了AcWing的背包视频,发现可以套用完全背包的思路;然后来了兴趣,认真看了下评论区和题解区,发现能够使用BFS的思路,真是妙啊!遂记录一下。一、DFS+剪枝看到题,感觉和之前的子集、全排列、电话号码的字母组合等题目相近,二话不说直接开写。 int coinChange(vector<int>& coins, int amou原创 2021-02-28 17:39:10 · 619 阅读 · 0 评论 -
分治:至少有K个重复字符的最长子串
分治策略的常见应用有二分法(分治应用于边界划分)、归并排序和快速排序,实现和详解见排序归纳总结(插入排序、归并排序、堆排序、快速排序、桶排序)在此简单总结一下分治的思想,一个问题可以拆分成众多的相同结构的子问题的求解,且子问题和原问题是相同性质的,且分出的子问题之间互不影响也即相互独立。同时,某个子问题中的解就是原问题的解。接下来进入正题,以LeetCode 395. 至少有K个重复字符的最长子串为例,再理一下分治的思路。题目给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求原创 2021-02-27 17:53:12 · 1224 阅读 · 3 评论 -
并查集——概念、模板及例题
1. 概念 并查集是一种树形的数据结构,顾名思义,就是用于处理一些不交集合的合并及查询的问题,其支持两种操作:查找(find):确定某个元素处于哪个子集;合并(union/merge):将两个子集合并成一个集合; 注意:并查集不支持集合的分离,但是并查集在经过修改后可以支持集合中单个元素的删除操作)。使用动态开点线段树还可以实现可持久化并查集。2. 模板实现2.1 查找(find)实现 通俗地讲一个故事:几个家族进行宴会,但是家族普遍长寿,所以人数众多。由于长时间的分离以及年龄的增原创 2021-02-15 21:12:20 · 319 阅读 · 1 评论 -
O(1)空间复杂度遍历二叉树——Morris遍历
在之前学习的二叉树遍历(前文传送门)当中,其时间复杂度均为O(1)\mathcal{O}(1)O(1),而空间复杂度为O(n)\mathcal{O}(n)O(n),其或是利用递归调用栈或是数据结构中的栈结构来完成对树中节点的多次访问,也就是利用了辅助空间来实现二叉树的遍历。文章目录1. 实现思路2. 代码实现3. 分析推导3.1 Morris遍历的规律和与递归栈方式的对比3.2 Morris前序遍历3.3 Morris中序遍历3.4 Morris后序遍历1. 实现思路将当前所遍历到的节点记为cu原创 2021-01-29 00:30:50 · 701 阅读 · 0 评论 -
O(1)时间复杂度来获得队列或栈的最大值或者最小值
该类题型通常是让自己设计并封装应用程序接口(Application Programming Interface, API),即一些预先定义的函数,或指软件系统不同组成部分衔接的约定。 通常是使用常用的数据结构组合或是作为辅助空间来实现这些接口。具体选用何种数据结构来实现,一是依照题目中对时间或空间复杂度的要求,二是在平常的练习当中多加总结。 以下列出相关题目,题目中对时间复杂度的要求均为O(1)O(1)O(1),所以很容易想到用空间换取时间的思路。(一) 剑指 Offer 30. 包含min函原创 2021-01-22 16:16:23 · 2677 阅读 · 1 评论 -
数组中数字出现的次数——位运算专题
(一)136. 只出现一次的数字题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。算法应该具有线性时间复杂度,且不使用额外空间。思路:用异或进行解决,那么,如果有若干个数字进行异或操作:a1⊕a2⊕...⊕ana_{1} \oplus a_{2} \oplus ... \oplus a_{n}a1⊕a2⊕...⊕an,利用归零律,出现偶数次数的数字异或之后为0,再根据恒等率,那么只剩下其中只出现一次的元素。以下是异或的性质:交换律:p⊕原创 2021-01-20 21:53:09 · 287 阅读 · 1 评论 -
LeetCode42.接雨水(暴力、DP、单调栈)
42. 接雨水题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1.输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1][0,1,0,2,1,0,1,3,2,1,2,1][0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 666个单位的雨水(蓝色部分表示雨水);示例 2.输入:heig原创 2021-01-04 16:05:05 · 161 阅读 · 1 评论 -
回溯法
文章目录1. 什么是回溯法2. 回溯的一般结构3. 相关题目1. 什么是回溯法回溯法的概念: 回溯法可以看成蛮力法的升级版,从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案。回溯法非常适合由多个步骤组成的问题,并且每个步骤都有多个选项。当在某一步选择了其中一个选项时,就进入下一步,然后又面临新选项。如上步骤进行多次选择,最终达到最终状态。 换句话说,回溯就是通过不同的尝试来生成问题的解,有点类似于穷举,但是和穷举不同的是回溯会“剪枝”。(剪枝的意思也就是说对已经知道错误的结果没原创 2020-12-30 17:18:34 · 1100 阅读 · 1 评论 -
是否是子串——KMP算法
文章目录1. 引入2. KMP如何避免重复比较2.1 最大前缀后缀匹配长度2.2 最大前缀后缀匹配长度有何用处3. KMP算法的实现(C++版本)3.1 求取字符的最长前缀后缀匹配长度3.1 KMP算法的实现1. 引入 KMP算法解决的是判断一个字符串mmm是否是另一个字符串sss的子串(包含在一个字符串中的连续字符串)这一问题。 我们很容易想到对sss字符串的每个字符逐个开始与mmm字符串进行比较,若是中间有字符不相同则从sss中取下一个字符重新与mmm进行比较。这就是暴力方法判断是否为子串的方原创 2020-12-26 18:22:41 · 1062 阅读 · 0 评论 -
回文子串——Manacher算法
1. 引入 Manacher算法/马拉车算法是LeetCode647. 回文子串所用的算法。该算法可用于寻找回文子串、回文子串数、最长回文子串长度等问题。 回文字符串,其含义是一个字符串正向还是反向读都是一样的。例如“abba","moon","level"等就是回文字符串,可以理解为对称字符串。 回文子串,其含义是一个字符串当中的回文字符串。须要引入三个概念:其中心位置的点为基准点/中心点,其最长的左右边界的字符为左右边界点,左右边界点到基准点的距离称为回文半径。比如"level",其基准点为原创 2020-12-24 17:01:55 · 340 阅读 · 0 评论 -
单调栈寻找最近较大的元素的距离或值
739. 每日温度题目描述: 请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 000 来代替。例如,给定一个列表 temperatures=[73,74,75,71,69,72,76,73]temperatures = [73, 74, 75, 71, 69, 72, 76, 73]temperatures=[73,74,75,71,69,72,76,73],你的输出应该是[1,1,4,2,1,1,0,0][1原创 2020-12-16 17:30:36 · 238 阅读 · 0 评论 -
二叉树的前中后层序遍历(递归方法和迭代/模板方法)
文章目录1. 二叉树深度优先(BFS)遍历1.1 前序遍历1.2 中序遍历1. 二叉树深度优先(BFS)遍历二叉树的遍历规则:上树中,前中后序遍历顺序如下:前序遍历(中左右):5 4 1 2 6 7 8中序遍历(左中右):1 4 2 5 7 6 8后序遍历(左右中):1 2 4 7 8 6 5递归,对于递归,要明确三要素:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类原创 2020-12-02 15:21:48 · 444 阅读 · 0 评论 -
排序归纳总结(插入排序、归并排序、堆排序、快速排序、桶排序)
文章目录1. 插入排序2. 归并排序3. 堆排序4. 快速排序5. 桶排序排序问题由 Kth Element 问题引出。LeetCode传送门:215. 数组中的第K个最大元素 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4最简单的版本,使用STL当中的s原创 2020-12-08 11:26:05 · 976 阅读 · 0 评论 -
Floyd判圈法(Floyd Cycle Detection Algorithm)
Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm)。可用于判定链表、迭代函数、有限状态机中是否有环。如果有环,可以找出环的起点,求出环的长度。 基本思想:利用了快慢指针的思想。两个人在赛跑,A速度快,B速度慢,若是存在环(勺状图),A和B总是会相遇的,相遇时A所经过的路径的长度要比B多若干个环的长度。算法时间复杂度:令S到P的距离为m,环的长度为n,时间复杂度O(m+n),即O(n);原创 2020-11-30 10:55:03 · 785 阅读 · 0 评论