摘要: KMP 算法(Knuth Morris Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。 很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解,也不知道有多少未来的 Knuth、Morris、Pratt 被提前劝退了。有一些优秀的同学通过手推 阅读全文
posted @ 2020-02-17 12:30 labuladong 阅读(883) 评论(0) 推荐(0) 编辑
摘要: 上一篇文章 "几道智力题" 中讨论到一个有趣的「石头游戏」,通过题目的限制条件,这个游戏是先手必胜的。但是智力题终究是智力题,真正的算法问题肯定不会是投机取巧能搞定的。所以,本文就借石头游戏来讲讲「假设两个人都足够聪明,最后谁会获胜」这一类问题该如何用动态规划算法解决。 博弈类问题的套路都差不多,下 阅读全文
posted @ 2020-02-17 12:29 labuladong 阅读(706) 评论(0) 推荐(0) 编辑
摘要: 之前的文章「动态规划详解」收到了普遍的好评,今天写一个动态规划的实际应用:正则表达式。如果有读者对「动态规划」还不了解,建议先看一下上面那篇文章。 正则表达式匹配是一个很精妙的算法,而且难度也不小。本文主要写两个正则符号的算法实现:点号「.」和星号「 」,如果你用过正则表达式,应该明白他们的用法,不 阅读全文
posted @ 2020-02-17 12:27 labuladong 阅读(956) 评论(0) 推荐(0) 编辑
摘要: 四键键盘问题很有意思,而且可以明显感受到:对 dp 数组的不同定义需要完全不同的逻辑,从而产生完全不同的解法。 首先看一下题目: 如何在 N 次敲击按钮后得到最多的 A?我们穷举呗,每次有对于每次按键,我们可以穷举四种可能,很明显就是一个动态规划问题。 第一种思路 这种思路会很容易理解,但是效率并不 阅读全文
posted @ 2020-02-17 12:26 labuladong 阅读(665) 评论(0) 推荐(1) 编辑
摘要: 什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间 阅读全文
posted @ 2020-02-17 12:24 labuladong 阅读(1204) 评论(1) 推荐(0) 编辑
摘要: 说到密码,我们第一个想到的就是登陆账户的密码,但是从密码学的角度来看,这种根本就不算合格的密码。 为什么呢,因为我们的账户密码,是依靠隐蔽性来达到加密作用:密码藏在我心里,你不知道,所以你登不上我的账户。 然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性, 阅读全文
posted @ 2020-02-17 12:22 labuladong 阅读(871) 评论(0) 推荐(0) 编辑
摘要: 通过之前的文章 "框架思维" ,二叉树的遍历框架应该已经印到你的脑子里了,这篇文章就来实操一下,看看框架思维是怎么灵活运用,秒杀一切二叉树问题的。 二叉树算法的设计的总路线:明确一个节点要做的事情,然后剩下的事抛给框架。 举两个简单的例子体会一下这个思路,热热身。 1. 如何把二叉树所有的节点中的值 阅读全文
posted @ 2020-02-17 12:21 labuladong 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 我们最终要实现的计算器功能如下: 1、输入一个字符串,可以包含 、数字、括号以及空格,你的算法返回运算结构。 2、要符合运算法则,括号的优先级最高,先乘除后加减。 3、除号是整数除法,无论正负都向 0 取整(5/2=2, 5/2= 2)。 4、可以假定输入的算式一定合法,且计算过程不会出现整型溢出, 阅读全文
posted @ 2020-02-17 12:18 labuladong 阅读(733) 评论(0) 推荐(0) 编辑
摘要: 前文讲了一种特殊的数据结构「单调栈」monotonic stack,解决了一类问题「Next Greater Number」,本文写一个类似的数据结构「单调队列」。 也许这种数据结构的名字你没听过,其实没啥难的,就是一个「队列」,只是使用了一点巧妙的方法,使得队列中的元素单调递增(或递减)。这个数据 阅读全文
posted @ 2020-02-17 12:16 labuladong 阅读(487) 评论(0) 推荐(0) 编辑
摘要: 啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色。 这种算法思想还在许多其他地方有应用。比如说扫雷游戏,有时候你点一个方格,会一下子展开一片区域,这个展开过程,就是 FloodFill 算法实现的。 阅读全文
posted @ 2020-02-17 12:15 labuladong 阅读(12500) 评论(1) 推荐(1) 编辑
摘要: 今天讲讲 Union Find 算法,也就是常说的并查集算法,主要是解决图论中「动态连通性」问题的。名词很高端,其实特别好理解,等会解释,另外这个算法的应用都非常有趣。 说起这个 Union Find,应该算是我的「启蒙算法」了,因为《算法4》的开头就介绍了这款算法,可是把我秀翻了,感觉好精妙啊!后 阅读全文
posted @ 2020-02-17 12:13 labuladong 阅读(2782) 评论(0) 推荐(1) 编辑
摘要: 上篇文章很多读者对于 Union Find 算法的应用表示很感兴趣,这篇文章就拿几道 LeetCode 题目来讲讲这个算法的巧妙用法。 首先,复习一下,Union Find 算法解决的是图的动态连通性问题,这个算法本身不难,能不能应用出来主要是看你抽象问题的能力,是否能够把原始问题抽象成一个有关图论 阅读全文
posted @ 2020-02-17 12:12 labuladong 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 先给大家讲个笑话乐呵一下: 有一天阿东到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有登记出借。阿东正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是 阅读全文
posted @ 2020-02-17 12:10 labuladong 阅读(4353) 评论(0) 推荐(2) 编辑
摘要: 上篇文章用贪心算法解决了区间调度问题:给你很多区间,让你求其中的最大不重叠子集。 其实对于区间相关的问题,还有很多其他类型,本文就来讲讲区间合并问题(Merge Interval)。 LeetCode 第 56 题就是一道相关问题,题目很好理解: 我们解决区间问题的一般思路是先排序,然后观察规律。 阅读全文
posted @ 2020-02-17 12:08 labuladong 阅读(635) 评论(0) 推荐(0) 编辑
摘要: 今天来聊一道简单却十分巧妙的算法问题:算出一共有几个和为 k 的子数组。 那我把所有子数组都穷举出来,算它们的和,看看谁的和等于 k 不就行了。 关键是, 如何快速得到某个子数组的和呢 ,比如说给你一个数组 ,让你实现一个接口 ,这个接口要返回 的和,而且会被多次调用,你怎么实现这个接口呢? 因为接 阅读全文
posted @ 2020-02-17 12:05 labuladong 阅读(522) 评论(0) 推荐(1) 编辑
摘要: 上篇文章 "洗牌算法详解" 讲到了验证概率算法的蒙特卡罗方法,今天聊点轻松的内容:几个和概率相关的有趣问题。 计算概率有下面两个最简单的原则: 原则一、计算概率一定要有一个参照系,称作「样本空间」,即随机事件可能出现的所有结果。事件 A 发生的概率 = A 包含的样本点 / 样本空间的样本总数。 原 阅读全文
posted @ 2020-02-17 12:04 labuladong 阅读(1080) 评论(0) 推荐(0) 编辑
摘要: 我知道大家会各种花式排序算法,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验,因为「乱」可以有很多种,你怎么能证明你的算法是「真的乱」呢? 所以我们面临两个问题: 1. 什么叫做「真的乱」? 2. 阅读全文
posted @ 2020-02-17 12:01 labuladong 阅读(3554) 评论(0) 推荐(0) 编辑
摘要: 本文分两部分,第一部分列举几个有趣的位操作,第二部分讲解算法中常用的 n & (n 1) 操作,顺便把用到这个技巧的算法题列出来讲解一下。因为位操作很简单,所以假设读者已经了解与、或、异或这三种基本操作。 位操作(Bit Manipulation)可以玩出很多奇技淫巧,但是这些技巧大部分都过于晦涩, 阅读全文
posted @ 2020-02-17 11:58 labuladong 阅读(353) 评论(0) 推荐(0) 编辑
摘要: 对于比较小的数字,做运算可以直接使用编程语言提供的运算符,但是如果相乘的两个因数非常大,语言提供的数据类型可能就会溢出。一种替代方案就是,运算数以字符串的形式输入,然后模仿我们小学学习的乘法算术过程计算出结果,并且也用字符串表示。 需要注意的是, 和 可以非常长,所以不可以把他们直接转成整型然后运算 阅读全文
posted @ 2020-02-17 11:57 labuladong 阅读(1166) 评论(0) 推荐(0) 编辑
摘要: 二分查找到底有能运用在哪里? 最常见的就是教科书上的例子,在 有序数组 中搜索给定的某个目标值的索引。再推广一点,如果目标值存在重复,修改版的二分查找可以返回目标值的左侧边界索引或者右侧边界索引。 PS:以上提到的三种二分查找算法形式在前文「二分查找详解」有代码详解,如果没看过强烈建议看看。 抛开有 阅读全文
posted @ 2020-02-17 11:55 labuladong 阅读(696) 评论(0) 推荐(0) 编辑
我的公众号 labuladong,专注于 LeetCode 刷题,欢迎关注。