11 2020 档案
摘要:读完本文,你可以去力扣拿下如下题目: 130.被围绕的区域 990.等式方程的可满足性 希望你已经读了这篇题解 Union-Find 算法详解 上篇文章很多读者对于 Union-Find 算法的应用表示很感兴趣,这篇文章就拿几道 LeetCode 题目来讲讲这个算法的巧妙用法。 首先,复习一下,Un
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 236.二叉树的最近公共祖先 如果说笔试的时候喜欢考各种动归回溯的骚操作,面试其实最喜欢考比较经典的问题,难度不算太大,而且也比较实用。 上篇文章 四个命令玩转 Git 写了 Git 最常用的命令,没有提分支合并,其实分支合并没什么困难的,主要就是 merge
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 560.和为K的子数组 今天来聊一道简单却十分巧妙的算法问题:算出一共有几个和为 k 的子数组。 那我把所有子数组都穷举出来,算它们的和,看看谁的和等于 k 不就行了。 关键是,如何快速得到某个子数组的和呢,比如说给你一个数组 nums,让你实现一个接口 sum
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 43.字符串相乘 对于比较小的数字,做运算可以直接使用编程语言提供的运算符,但是如果相乘的两个因数非常大,语言提供的数据类型可能就会溢出。一种替代方案就是,运算数以字符串的形式输入,然后模仿我们小学学习的乘法算术过程计算出结果,并且也用字符串表示。 需要注意的是
阅读全文
摘要:今天讲讲 Union-Find 算法,也就是常说的并查集算法,主要是解决图论中「动态连通性」问题的。名词很高端,其实特别好理解,等会解释,另外这个算法的应用都非常有趣。 说起这个 Union-Find,应该算是我的「启蒙算法」了,因为《算法4》的开头就介绍了这款算法,可是把我秀翻了,感觉好精妙啊!后
阅读全文
摘要:首先说明一个问题,简单阐述一下递归,分治算法,动态规划,贪心算法这几个东西的区别和联系,心里有个印象就好。 递归是一种编程技巧,一种解决问题的思维方式;分治算法和动态规划很大程度上是递归思想基础上的(虽然动态规划的最终版本大都不是递归了,但解题思想还是离不开递归),解决更具体问题的两类算法思想;贪心
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 191.位1的个数 231.2的幂 本文分两部分,第一部分列举几个有趣的位操作,第二部分讲解算法中常用的 n & (n - 1) 操作,顺便把用到这个技巧的算法题列出来讲解一下。因为位操作很简单,所以假设读者已经了解与、或、异或这三种基本操作。 位操作(Bit
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 354.俄罗斯套娃信封问题 很多算法问题都需要排序技巧,其难点不在于排序本身,而是需要巧妙地排序进行预处理,将算法问题进行转换,为之后的操作打下基础。 信封嵌套问题就需要先按特定的规则排序,之后就转换为一个 最长递增子序列问题 的技巧来解决了。 一、题目概述 信
阅读全文
摘要:通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友。由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜。我这免费写给你看,多宣传原创作者是你唯一能做的,谁也不希望劣币驱逐良币对吧? 这是好久之前的一篇文章「学习数据结构和算法的框架思
阅读全文
摘要:二分搜索怎么用?我和快手面试官进行了深度探讨 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 410.分割数组的最大值 经常有读者问我,读了之前的爆文 二分查找框架详解 之后,二分查找的算法他写的很溜了,但仅仅局限于在数组中搜索元素,不知道底怎么在算法题里面运用二分
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 704.二分查找 34.在排序数组中查找元素的第一个和最后一个位置 先给大家讲个笑话乐呵一下: 有一天阿东到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有登记出借。阿东正准备把每一本书在报警器下过一下,以找出引发警报的书
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 384.打乱数组 我知道大家会各种花式排序算法,但是如果叫你打乱一个数组,你是否能做到胸有成竹?即便你拍脑袋想出一个算法,怎么证明你的算法就是正确的呢?乱序算法不像排序算法,结果唯一可以很容易检验,因为「乱」可以有很多种,你怎么能证明你的算法是「真的乱」呢? 所
阅读全文
摘要:通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友。由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜。我这免费写给你看,多宣传原创作者是你唯一能做的,谁也不希望劣币驱逐良币对吧? 咱们的公众号有很多硬核的算法文章,今天就聊点轻松的
阅读全文
摘要:之前发的那篇关于框架性思维的文章,我也发到了不少其他圈子,受到了大家的普遍好评,这一点我真的没想到,首先感谢大家的认可,我会更加努力,写出通俗易懂的算法文章。 有很多朋友问我数据结构和算法到底该怎么学,尤其是很多朋友说自己是「小白」,感觉这些东西好难啊,就算看了之前的「框架思维」,也感觉自己刷题乏力
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 141.环形链表 141.环形链表II 167.两数之和 II - 输入有序数组 我把双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 295.数据流的中位数 如果输入一个数组,让你求中位数,这个好办,排个序,如果数组长度是奇数,最中间的一个元素就是中位数,如果数组长度是偶数,最中间两个元素的平均数作为中位数。 如果数据规模非常巨大,排序不太现实,那么也可以使用概率算法,随机抽取一部分数据,排序
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 969.煎饼排序 烧饼排序是个很有意思的实际问题:假设盘子上有 n 块面积大小不一的烧饼,你如何用一把锅铲进行若干次翻转,让这些烧饼的大小有序(小的在上,大的在下)? 设想一下用锅铲翻转一堆烧饼的情景,其实是有一点限制的,我们每次只能将最上面的若干块饼子翻转:
阅读全文
摘要:一文秒杀三道区间集合题目 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 1288.删除被覆盖区间 56.区间合并 986.区间列表的交集 经常有读者问区间相关的问题,今天写一篇文章,秒杀三道区间相关的问题。 所谓区间问题,就是线段问题,让你合并所有线段、找出线段的
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 986.区间列表的交集 本文是区间系列问题的第三篇,前两篇分别讲了区间的最大不相交子集和重叠区间的合并,今天再写一个算法,可以快速找出两组区间的交集。 先看下题目,LeetCode 第 986 题就是这个问题: 题目很好理解,就是让你找交集,注意区间都是闭区间。
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 56.合并区间 上篇文章用贪心算法解决了区间调度问题:给你很多区间,让你求其中的最大不重叠子集。 其实对于区间相关的问题,还有很多其他类型,本文就来讲讲区间合并问题(Merge Interval)。 LeetCode 第 56 题就是一道相关问题,题目很好理解:
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 733.扁平化嵌套列表 今天来讲一道非常有启发性的设计题目,为什么说它有启发性,我们后面再说。 一、题目描述 这是 LeetCode 第 341.扁平化嵌套列表迭代器,我来描述一下题目: 首先,现在有一种数据结构 NestedInteger,这个结构中存的数据可
阅读全文
摘要:上篇文章 洗牌算法详解 讲到了验证概率算法的蒙特卡罗方法,今天聊点轻松的内容:几个和概率相关的有趣问题。 计算概率有下面两个最简单的原则: 原则一、计算概率一定要有一个参照系,称作「样本空间」,即随机事件可能出现的所有结果。事件 A 发生的概率 = A 包含的样本点 / 样本空间的样本总数。 原则二
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 46.全排列 51.N皇后 这篇文章是很久之前的一篇《回溯算法详解》的进阶版,之前那篇不够清楚,就不必看了,看这篇就行。把框架给你讲清楚,你会发现回溯算法问题都是一个套路。 废话不多说,直接上回溯算法框架。解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 76.最小覆盖子串 567.字符串的排列 438.找到字符串中所有字母异位词 3.无重复字符的最长子串 鉴于前文 二分搜索框架详解 的那首《二分搜索升天词》很受好评,并在民间广为流传,成为安睡助眠的一剂良方,今天在滑动窗口算法框架中,我再次编写一首小诗来歌颂滑动
阅读全文
摘要:经常刷 LeetCode 的读者肯定知道鼎鼎有名的 twoSum 问题,我们上篇文章 twoSum 问题的核心思想 就对 twoSum 的几个变种做了解析。 但是除了 twoSum 问题,LeetCode 上面还有 3Sum,4Sum 问题,我估计以后出个 5Sum,6Sum 也不是不可能。 那么,
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 22.括号生成 括号问题可以简单分成两类,一类是前文写过的 括号的合法性判断 ,一类是合法括号的生成。对于括号合法性的判断,主要是借助「栈」这种数据结构,而对于括号的生成,一般都要利用回溯递归的思想。 关于回溯算法,我们前文写过一篇 回溯算法套路框架详解 反响非
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 111.二叉树的最小深度 752.打开转盘锁 后台有很多人问起 BFS 和 DFS 的框架,今天就来说说吧。 首先,你要说 labuladong 没写过 BFS 框架,这话没错,今天写个框架你背住就完事儿了。但要是说没写过 DFS 框架,那你还真是说错了,其实
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 37.解数独 经常拿回溯算法来说事儿的,无非就是八皇后问题和数独问题了。那我们今天就通过实际且有趣的例子来讲一下如何用回溯算法来解决数独问题。 一、直观感受 说实话我小的时候也尝试过玩数独游戏,但从来都没有完成过一次。做数独是有技巧的,我记得一些比较专业的数独游
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 1109.航班预订统计 前文 前缀和技巧详解 写过的前缀和技巧是非常常用的算法技巧,前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。 没看过前文没关系,这里简单介绍一下前缀和,核心代码就是下面这段: class PrefixSum {
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 733.图像渲染 啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色。 这种算法思想还在许多其他地方有应用。比如说扫雷游戏,有时候你点一个方格,会一下子展开一片区
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 773.滑动谜题 滑动拼图游戏大家应该都玩过,下图是一个 4x4 的滑动拼图: 拼图中有一个格子是空的,可以利用这个空着的格子移动其他数字。你需要通过移动这些数字,得到某个特定排列顺序,这样就算赢了。 我小时候还玩过一款叫做「华容道」的益智游戏,也和滑动拼图比较
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 1.两数之和 170.两数之和 III - 数据结构设计 Two Sum 系列问题在 LeetCode 上有好几道,这篇文章就挑出有代表性的几道,介绍一下这种问题怎么解决。 TwoSum I 这个问题的最基本形式是这样:给你一个数组和一个整数 target,可以
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 222.完全二叉树的节点个数 如果让你数一下一棵普通二叉树有多少个节点,这很简单,只要在二叉树的遍历框架上加一点代码就行了。 但是,如果给你一棵完全二叉树,让你计算它的节点个数,你会不会?算法的时间复杂度是多少?这个算法的时间复杂度应该是 O(logN*logN
阅读全文
摘要:给我 O(1) 的时间,我可以删除/查找数组中的任意元素 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 380.常数时间插入、删除和获取随机元素 710.黑名单中的随机数 本文讲两道比较有技巧性的数据结构设计题,都是和随机读取元素相关的,我们前文 水塘抽样算法 也
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 224.基本计算器 227.基本计算器II 772.基本计算器III 我们最终要实现的计算器功能如下: 1、输入一个字符串,可以包含+ - * /、数字、括号以及空格,你的算法返回运算结果。 2、要符合运算法则,括号的优先级最高,先乘除后加减。 3、除号是整数除
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 355.设计推特 「design Twitter」是 LeetCode 上第 355 道题目,不仅题目本身很有意思,而且把合并多个有序链表的算法和面向对象设计(OO design)结合起来了,很有实际意义,本文就带大家来看看这道题。 至于 Twitter 的什么
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 100.相同的树 450.删除二叉搜索树中的节点 701.二叉搜索树中的插入操作 700.二叉搜索树中的搜索 98.验证二叉搜索树 通过之前的文章框架思维,二叉树的遍历框架应该已经印到你的脑子里了,这篇文章就来实操一下,看看框架思维是怎么灵活运用,秒杀一切二叉树
阅读全文
摘要:东哥手把手带你刷二叉树(第三期) 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 652.寻找重复的子树 接前文 手把手带你刷二叉树(第一期) 和 手把手带你刷二叉树(第二期),本文继续来刷二叉树。 从前两篇文章的阅读量来看,大家还是能够通过二叉树学习到 框架思维
阅读全文
摘要:东哥手把手带你刷二叉树(第二期) 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 654.最大二叉树 105.从前序与中序遍历序列构造二叉树 106.从中序与后序遍历序列构造二叉树 上篇文章 手把手教你刷二叉树(第一篇) 连刷了三道二叉树题目,很多读者直呼内行。其实
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 226.翻转二叉树 114.二叉树展开为链表 116.填充每个节点的下一个右侧节点指针 我们的成名之作 学习数据结构和算法的框架思维 中多次强调,先刷二叉树的题目,先刷二叉树的题目,先刷二叉树的题目,因为很多经典算法,以及我们前文讲过的所有回溯、动归、分治算法,
阅读全文
摘要:二叉树的序列化和反序列化 JSON 的运用非常广泛,比如我们经常将变成语言中的结构体序列化成 JSON 字符串,存入缓存或者通过网络发送给远端服务,消费者接受 JSON 字符串然后进行反序列化,就可以得到原始数据了。这就是「序列化」和「反序列化」的目的,以某种固定格式组织字符串,使得数据可以独立于编
阅读全文
摘要:二叉堆(Binary Heap)没什么神秘,性质比二叉搜索树 BST 还简单。其主要操作就两个,sink(下沉)和 swim(上浮),用以维护二叉堆的性质。其主要应用有两个,首先是一种排序方法「堆排序」,第二是一种很有用的数据结构「优先级队列」。 本文就以实现优先级队列(Priority Queue
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 92.反转链表II 反转单链表的迭代实现不是一个困难的事情,但是递归实现就有点难度了,如果再加一点难度,让你仅仅反转单链表中的一部分,你是否能够递归实现呢? 本文就来由浅入深,step by step 地解决这个问题。如果你还不会递归地反转单链表也没关系,本文会
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 232.用栈实现队列 225.用队列实现栈 队列是一种先进先出的数据结构,栈是一种先进后出的数据结构,形象一点就是这样: 这两种数据结构底层其实都是数组或者链表实现的,只是 API 限定了它们的特性,那么今天就来看看如何使用「栈」的特性来实现一个「队列」,如何用
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 496.下一个更大元素I 503.下一个更大元素II 1118.一月有多少天 栈(stack)是很简单的一种数据结构,先进后出的逻辑顺序,符合某些问题的特点,比如说函数调用栈。 单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 239.滑动窗口最大值 前文讲了一种特殊的数据结构「单调栈」monotonic stack,解决了一类问题「Next Greater Number」,本文写一个类似的数据结构「单调队列」。 也许这种数据结构的名字你没听过,其实没啥难的,就是一个「队列」,只是使用
阅读全文
摘要:层层拆解,带你手写 LFU 算法 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 460.LFU缓存机制 上篇文章 带你手写LRU算法 写了 LRU 缓存淘汰算法的实现方法,本文来写另一个著名的缓存淘汰算法:LFU 算法。 LRU 算法的淘汰策略是 Least Re
阅读全文
摘要:读者经常让我写刷题路线,我觉得这些东西太枯燥了,今天就编一个故事讲讲。 这要从小东开始学习技术开始讲起。 小东是一个目标明确的人,自从上了大学就在琢磨怎么才能找高薪工作多赚钱。他发现做程序员工资挺高,而且有大量优秀的 在线练习平台,所以毅然决定入坑。 计算机的几大基础,Linux 操作系统当然是必知
阅读全文
摘要:好吧,我也做了回标题党,像我这么细心的同学,怎么可能让服务器被入侵呢? 其实是这样的,昨天我和一个朋友聊天,他说他自己有一台云服务器运行了 Redis 数据库,有一天突然发现数据库里的数据全没了,只剩下一个奇奇怪怪的键值对,其中值看起来像一个 RSA 公钥的字符串,他以为是误操作删库了,幸好自己的服
阅读全文
摘要:虽说我没事就喜欢喷应试教育,但我也从应试教育中发现了一个窍门:如果能够以刷题的形式学习某项技能,效率和效果是最佳的。对于技术的学习,我经常面临的困境是,理论知识知道的不少,但是有的场景实在无法模拟,缺少亲自动手实践的机会,如果能有一本带标准答案的习题册让我刷刷就好了。 所以在学习新技术时,我首先会去
阅读全文
摘要:说到密码,我们第一个想到的就是登陆账户的密码,但是从密码学的角度来看,这种根本就不算合格的密码。 为什么呢,因为我们的账户密码,是依靠隐蔽性来达到加密作用:密码藏在我心里,你不知道,所以你登不上我的账户。 然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性,
阅读全文
摘要:说到进程,恐怕面试中最常见的问题就是线程和进程的关系了,那么先说一下答案:在 Linux 系统中,进程和线程几乎没有区别。 Linux 中的进程就是一个数据结构,看明白就可以理解文件描述符、重定向、管道命令的底层工作原理,最后我们从操作系统的角度看看为什么说线程和进程基本没有区别。 PS:我认真写了
阅读全文
摘要:算法笔试骗分套路 相关推荐: 一文秒杀四道原地修改数组的算法题 双指针技巧总结 我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说做题复习的策略。 避实就虚 大家也知道,大部分笔试题目都需要你自己来处理输入数据,然后让程序打印输出。判题的底层原理是,把你程序的输出用 Lin
阅读全文
摘要:cookie 大家应该都熟悉,比如说登录某些网站一段时间后,就要求你重新登录;再比如有的同学很喜欢玩爬虫技术,有时候网站就是可以拦截住你的爬虫,这些都和 cookie 有关。如果你明白了服务器后端对于 cookie 和 session 的处理逻辑,就可以解释这些现象,甚至钻一些空子无限白嫖,待我慢慢
阅读全文
摘要:Linux 文件目录都是什么鬼? 相关推荐: 如何高效进行模幂运算 动态规划和回溯算法到底谁是谁爹? Linux 系统大家一定不陌生,学习工作中肯定会和 Linux 打交道。不过谈及 Linux,给人的第一印象可能就是黑乎乎的命令行,乱七八糟的文件夹,甚至安装软件都不知道是怎么安装上去的。 其实这些
阅读全文
摘要:前几篇关于 Linux 的文章很受欢迎,很多读者都希望我多写写这方面的文章。我以后会定期分享一些 Linux 的实用小技巧,你用习惯之后可能就会和我一样,使用 Windows 就头疼。。。 先说句题外话,大家总是问能不能装双系统,装什么 Linux 发行版比较好。这里统一回答一下,装双系统很简单的,
阅读全文
摘要:我个人很喜欢使用 Linux 系统,虽然说 Windows 的图形化界面做的确实比 Linux 好,但是对脚本的支持太差了。一开始有点不习惯命令行操作,但是熟悉了之后反而发现移动鼠标点点点才是浪费时间的罪魁祸首。。。 那么对于 Linux 命令行,本文不是介绍某些命令的用法,而是说明一些简单却特别容
阅读全文
摘要:我先开一会儿吐槽大会,Git 这东西我用了两年,根本尼玛用不明白。 我搞不明白的一个重要原因就是,命令的功能太杂,有时候一个需求可以用好几种命令解决,而且有的命令还 tm 有别名。这导致什么问题呢,我在网上找到的答案五花八门,竟然都能达成目的,难以找到规律,毫无套路可言。对于我这种不喜欢动脑子,只喜
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 5.最长回文子串 回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么。 首先,明确一下什:回文串就是正着读和反着读都一样的字符串。 比如说字符串 aba 和 abba 都是回文串,因为它们对称,反过来还是和本身一样。反之,
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 855.考场就座 这是 LeetCode 第 855 题,有趣且具有一定技巧性。这种题目并不像动态规划这类算法拼智商,而是看你对常用数据结构的理解和写代码的水平,个人认为值得重视和学习。 另外说句题外话,很多读者都问,算法框架是如何总结出来的,其实框架反而是慢慢
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 78.子集 46.全排列 77.组合 今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combination)。 这几个问题都可以用回溯算法模板解决,同时子集问题还可以用数学归纳思想解
阅读全文
摘要:如何去除有序数组的重复元素 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 26.删除排序数组中的重复项 83.删除排序链表中的重复元素 27.移除元素 283.移动零 我们知道对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 292.Nim游戏 877.石子游戏 319.灯泡开关 下文是我在 LeetCode 刷题过程中总结的三道有趣的「脑筋急转弯」题目,可以使用算法编程解决,但只要稍加思考,就能找到规律,直接想出答案。 一、Nim 游戏 游戏规则是这样的:你和你的朋友面前有一堆石子
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 448.找到所有数组中消失的数字 之前也有文章写过几个有趣的智力题,今天再聊一道巧妙的题目。 题目非常简单: 给一个长度为 n 的数组,其索引应该在 [0,n),但是现在你要装进去 n + 1 个元素 [0,n],那么肯定有一个元素装不下嘛,请你找出这个缺失的元
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 55.跳跃游戏 45.跳跃游戏 II 经常有读者在后台问,动态规划和贪心算法到底有啥关系。我们之前的文章 贪心算法之区间调度问题 就说过一个常见的时间区间调度的贪心算法问题。 说白了,贪心算法可以理解为一种特殊的动态规划问题,拥有一些更特殊的性质,可以进一步降低
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 382.链表随机节点 398.随机数索引 我最近在 LeetCode 上做到两道非常有意思的题目,382 和 398 题,关于水塘抽样算法(Reservoir Sampling),本质上是一种随机概率算法,解法应该说会者不难,难者不会。 我第一次见到这个算法问题
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 645.错误的集合 今天就聊一道很看起来简单却十分巧妙的问题,寻找缺失和重复的元素。之前的一篇文章「寻找缺失元素」也写过类似的问题,不过这次的和上次的问题使用的技巧不同。 这是 LeetCode 645 题,我来描述一下这个题目: 给一个长度为 N 的数组 nu
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 26.删除排序数组中的重复项 83.删除排序链表中的重复元素 我们知道对于数组来说,在尾部插入、删除元素是比较高效的,时间复杂度是 O(1),但是如果在中间或者开头插入、删除元素,就会涉及数据的搬移,时间复杂度为 O(N),效率较低。 所以对于一般处理数组的算法
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 234.回文链表 我们之前有两篇文章写了回文串和回文序列相关的问题。 寻找回文串的核心思想是从中心向两端扩展: string palindrome(string& s, int l, int r) { // 防止索引越界 while (l >= 0 && r <
阅读全文
摘要:一文秒杀三道括号相关的题目 读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 20.有效的括号 921.使括号有效的最小插入 1541.平衡括号串的最少插入 判断合法括号串 对括号的合法性判断多次在笔试中出现,现实中也很常见,比如说我们写的代码,编辑器会检查括号是否正
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 172.阶乘后的零 793.阶乘后K个零 笔试题中经常看到阶乘相关的题目,今天说两个最常见的题目: 1、输入一个非负整数 n,请你计算阶乘 n! 的结果末尾有几个 0。 比如说输入 n = 5,算法返回 1,因为 5! = 120,末尾有一个 0。 函数签名如下
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 42.接雨水 接雨水这道题目挺有意思,在面试题中出现频率还挺高的,本文就来步步优化,讲解一下这道题。 先看一下题目: 就是用一个数组表示一个条形图,问你这个条形图最多能接多少水。 int trap(int[] height); 下面就来由浅入深介绍暴力解法 →
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 20.有效的括号 对括号的合法性判断是一个很常见且实用的问题,比如说我们写的代码,编辑器和编译器都会检查括号是否正确闭合。而且我们的代码可能会包含三种括号 [](){},判断起来有一点难度。 本文就来聊一道关于括号合法性判断的算法题,相信能加深你对栈这种数据结构
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 392.判断子序列 二分查找本身不难理解,难在巧妙地运用二分查找技巧。对于一个问题,你可能都很难想到它跟二分查找有关,比如前文 最长递增子序列 就借助一个纸牌游戏衍生出二分查找解法。 今天再讲一道巧用二分查找的算法问题:如何判定字符串 s 是否是字符串 t 的子
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 316.去除重复字母 1081.不同字符的最小子序列 关于去重算法,应该没什么难度,往哈希集合里面塞不就行了么? 最多给你加点限制,问你怎么给有序数组原地去重,这个我们旧文 如何高效地给有序数组/链表去重。 本文讲的问题应该是去重相关算法中难度最大的了,把这个问
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 204.计数质数 素数的定义看起来很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数: // 返回区间 [2, n) 中有几个素数 int countP
阅读全文
摘要:吃葡萄问题 学好算法全靠套路,认准 labuladong 就够了! 如果你在迎战秋招,东哥悄悄告诉你一些 笔试中的套路。 相关推荐: 团灭 LeetCode 股票买卖问题 一文看懂 session 和 cookie 读完本文,你可以去力扣拿下如下题目: 吃葡萄 今天在牛客网上做了一道叫做「吃葡萄」的
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 372.超级次方 今天来聊一道与数学运算有关的题目,LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数。 int superPow(int a, vector<int>& b); 要求你的算法返回幂运算 a^b 的计算结果与 13
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 146.LRU缓存机制 一、什么是 LRU 算法 就是一种缓存淘汰策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 25.K个一组翻转链表 之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决。 本文要解决「K 个一组反转链表」,不难理解: 这个问题经常在面经中看到,而
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 875.爱吃香蕉的珂珂 1011.在D天内送达包裹的能力 二分查找到底有能运用在哪里? 最常见的就是教科书上的例子,在有序数组中搜索给定的某个目标值的索引。再推广一点,如果目标值存在重复,修改版的二分查找可以返回目标值的左侧边界索引或者右侧边界索引。 PS:以上
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 1143.最长公共子序列 最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套路,比如说编辑距离。而且,这个算法稍加改造就可以
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 516.最长回文子序列 子序列问题是常见的算法问题,而且并不好解决。 首先,子序列问题本身就相对子串、子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举你都不一定会,更别说求解相关的算法问题了。 而且,子序列问题很可能涉及到两个字符串,比如前文
阅读全文
摘要:这篇文章就给你讲明白两个问题: 1、到底什么才叫「最优子结构」,和动态规划什么关系。 2、为什么动态规划遍历 dp 数组的方式五花八门,有的正着遍历,有的倒着遍历,有的斜着遍历。 一、最优子结构详解 「最优子结构」是某些问题的一种特定性质,并不是动态规划问题专有的。也就是说,很多问题其实都具有最优子
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 1312.让字符串成为回文串的最少插入次数 回文串就是正着读反着读都一样的字符,在笔试面试中经常出现这类问题。 labuladong 公众号有好几篇讲解回文问题的文章,是判断回文串或者寻找最长回文串/子序列的: 判断回文链表 计算最长回文子串 计算最长回文子序列
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 53.最大子序和 最大子数组问题和前文讲过的 经典动态规划:最长递增子序列 的套路非常相似,代表着一类比较特殊的动态规划问题的思路: 思路分析 其实第一次看到这道题,我首先想到的是滑动窗口算法,因为我们前文说过嘛,滑动窗口算法就是专门处理子串/子数组问题的,这里
阅读全文
摘要:我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O(N^2),堪称算法界的二向箔,把各路魑魅魍魉统统打成二次元。 但是,动态规划本身也是可以进行阶段性优化的,比如说我们常听说的「状态压缩」技巧,就能够把很多动态规划解
阅读全文
摘要:本文思路参考自英文版 LeetCode 题解: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/discuss/108870/Most-consistent-ways-of-deal
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 312.戳气球 今天我们要聊的这道题「Burst Balloon」和之前我们写过的那篇 经典动态规划:高楼扔鸡蛋问题 分析过的高楼扔鸡蛋问题类似,知名度很高,但难度确实也很大。因此 labuladong 公众号就给这道题赐个座,来看一看这道题目到底有多难。 它是
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 435. 无重叠区间 452.用最少数量的箭引爆气球 什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 有读者私下问我 LeetCode 「打家劫舍」系列问题(英文版叫 House Robber)怎么做,我发现这一系列题目的点赞非常之高,是比较有代表性和技巧性的动态规划题目,今天就来聊聊这道题目。 打
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 887.鸡蛋掉落 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼。国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋太浪费,改成扔杯子,扔破碗什么的。 具体的问题等会再说,但是这道题的解法技巧很
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 887.鸡蛋掉落 上篇文章聊了高楼扔鸡蛋问题,讲了一种效率不是很高,但是较为容易理解的动态规划解法。后台很多读者问如何更高效地解决这个问题,今天就谈两种思路,来优化一下这个问题,分别是二分查找优化和重新定义状态转移。 如果还不知道高楼扔鸡蛋问题的读者可以看下「经
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 651.四键键盘 PS:现在这到题好想变成会员题目了?我当时做的时候还是免费的。 四键键盘问题很有意思,而且可以明显感受到:对 dp 数组的不同定义需要完全不同的逻辑,从而产生完全不同的解法。 首先看一下题目: 如何在 N 次敲击按钮后得到最多的 A?我们穷举呗
阅读全文
摘要:读完本文,你不仅学会了算法套路,还可以顺便去 LeetCode 上拿下如下题目: 10.正则表达式匹配 正则表达式是一个非常强力的工具,本文就来具体看一看正则表达式的底层原理是什么。力扣第 10 题「正则表达式匹配」就要求我们实现一个简单的正则匹配算法,包括「.」通配符和「*」通配符。 这两个通配符
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 28.实现 strStr() KMP 算法(Knuth-Morris-Pratt 算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。 很多读者抱怨 KMP 算法无法理解,这很正常,想到大学教材上关于 KMP 算法的讲解,也不知道有多少未来的 Knut
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 509.斐波那契数 322.零钱兑换 这篇文章是我们号半年前一篇 200 多赞赏的成名之作「动态规划详解」的进阶版。由于账号迁移的原因,旧文无法被搜索到,所以我润色了本文,并添加了更多干货内容,希望本文成为解决动态规划的一部「指导方针」。 动态规划问题(Dyna
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 300.最长上升子序列 也许有读者看了前文 动态规划详解,学会了动态规划的套路:找到了问题的「状态」,明确了 dp 数组/函数的含义,定义了 base case;但是不知道如何确定「选择」,也就是不到状态转移的关系,依然写不出动态规划解法,怎么办? 不要担心,动
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 72.编辑距离 前几天看了一份鹅场的面试题,算法部分大半是动态规划,最后一题就是写一个计算编辑距离的函数,今天就专门写一篇文章来探讨一下这个问题。 我个人很喜欢编辑距离这个问题,因为它看起来十分困难,解法却出奇得简单漂亮,而且它是少有的比较实用的算法(是的,我承
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 416.分割等和子集 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 0-1 背包问题,今天来看看背包问题的思想能够如何运用到其他算法题目。 而且,不是经常有读者问,怎么将二维动态规划压缩成一维动态规划吗?这就是状态压缩,很容易的,本文也会提及这种技巧。
阅读全文
摘要:后台天天有人问背包问题,这个问题其实不难啊,如果我们号动态规划系列的十几篇文章你都看过,借助框架,遇到背包问题可以说是手到擒来好吧。无非就是状态 + 选择,也没啥特别之处嘛。 今天就来说一下背包问题吧,就讨论最常说的 0-1 背包问题。描述: 给你一个可装载重量为 W 的背包和 N 个物品,每个物品
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 518.零钱兑换II 零钱兑换 2 是另一种典型背包问题的变体,我们前文已经讲了 经典动态规划:0-1 背包问题。 希望你已经看过前两篇文章,看过了动态规划和背包问题的套路,这篇继续按照背包问题的套路,列举一个背包问题的变形。 本文聊的是 LeetCode 第
阅读全文
摘要:读完本文,你可以去力扣拿下如下题目: 509.斐波那契数 322.零钱兑换 这篇文章是我们号半年前一篇 200 多赞赏的成名之作「动态规划详解」的进阶版。由于账号迁移的原因,旧文无法被搜索到,所以我润色了本文,并添加了更多干货内容,希望本文成为解决动态规划的一部「指导方针」。 动态规划问题(Dyna
阅读全文