随笔分类 - 算法
摘要:并查集 并查集(union-find, 或 disjoint set)可以动态地连通两个点,并且可以非常快速地判断两个点是否连通。假设存在 n 个节点,我们先将所有节点的父亲标为自己;每次要连接节点 i 和 j 时, 我们可以将 i 的父亲标为 j;每次要查询两个节点是否相连时,我们可以查找 i 和
阅读全文
摘要:图通常分为有向(directed)或无向(undirected),有循环(cyclic)或无循环(acyclic),所有节点相连(connected)或不相连(disconnected)。树即是一个相连的无向无环图,而另一种很常见的图是有向无环图(Directed Acyclic Graph,DAG
阅读全文
摘要:树的递归 层次遍历 我们可以使用广度优先搜索进行层次遍历。注意,不需要使用两个队列来分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。 字典树 字典树(Trie)用于判断字符串是否存在或
阅读全文
摘要:(单)链表是由节点和指针构成的数据结构,每个节点存有一个值,和一个指向下一个节点的指针,因此很多链表问题可以用递归来处理。不同于数组,链表并不能直接获取任意节点的值, 必须要通过指针找到该节点后才能获取其值。同理,在未遍历到链表结尾时,我们也无法知道链表的长度,除非依赖其他数据结构储存长度。Leet
阅读全文
摘要:C++STL 1. Sequence Containers:维持顺序的容器。 (a). vector:动态数组,是我们最常使用的数据结构之一,用于 O(1) 的随机读取。因为大部分算法的时间复杂度都会大于 O(n),因此我们经常新建 vector 来存储各种数据或中间变量。因为在尾部增删的复杂度是
阅读全文
摘要:位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“<<” 算术左移和“>>”算术右移。以下是一些常见的位运算特性,其中0s和1s 分别表示只由 0 或 1 构成的二进制数字。除此之外
阅读全文
摘要:1.最小公倍数和最大公约数 2.质数 3.随机取样 4.Boyer-Moore 投票算法
阅读全文
摘要:动态规划(Dynamic Programming, DP)在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间 · · ·
阅读全文
摘要:深度优先搜索:在搜索到一个新的节点时,立即对该节点进行遍历;因此需用先入后出的栈,也可以通过与栈等价的递归来实现。深度优先搜索也可以用来检测环路:记录每个遍历过的节点的父节点,若一个节点被再次遍 历且父节点不同,则说明有环。我们也可以用之后会讲到的拓扑排序判断是否有环路,若最后存 在入度不为零的点,
阅读全文
摘要:1.快速排序 2.归并排序 3.插入排序 4.冒泡排序 5.选择排序
阅读全文
摘要:双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的 区域即为当前的窗口),经常用于区间搜索。若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是
阅读全文
摘要:贪心算法所采用的策略,是保证每次操作都是局部最优,从而使最后结果是全局最优。 1. n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。请你给每个孩子分发糖果
阅读全文
摘要:都同样是用于字符串的匹配算法。 BF:主串与模式串每一位进行比较,相同则同时往后移一位,不同则主串移到下一位i-j+2,模式串移到j=1,再进行比较如果j大于模式串长度,则匹配成功。 KMP:利用next数组求得最大子串的长度,主串与模式串相等则同时往后移一位,不同主串i不变,模式串j移到next[
阅读全文