首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
labuladong的算法专栏
labuladong
创建于2021-07-07
订阅专栏
东哥带你手把手刷算法
等 13 人订阅
共104篇文章
创建于2021-07-07
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
讲两道常考的阶乘算法题
1、输入一个非负整数 n,请你计算阶乘 n! 的结果末尾有几个 0。 比如说输入 n = 5,算法返回 1,因为 5! = 120,末尾有一个 0。 2、输入一个非负整数 K,请你计算有多少个 n,满足 n! 的结果末尾恰好有 K 个 0。 比如说输入 K = 1,算法返回 5…
如何判定括号合法性
对括号的合法性判断是一个很常见且实用的问题,比如说我们写的代码,编辑器和编译器都会检查括号是否正确闭合。而且我们的代码可能会包含三种括号 [](){},判断起来有一点难度。 本文就来聊一道关于括号合法性判断的算法题,相信能加深你对栈这种数据结构的理解。 题目很简单,输入一个字符…
二分查找高效判定子序列
二分查找本身不难理解,难在巧妙地运用二分查找技巧。对于一个问题,你可能都很难想到它跟二分查找有关,比如前文 最长递增子序列 就借助一个纸牌游戏衍生出二分查找解法。 今天再讲一道巧用二分查找的算法问题:如何判定字符串 s 是否是字符串 t 的子序列(可以假定 s 长度比较小,且 …
一道数组去重的算法题把东哥整不会了
最多给你加点限制,问你怎么给有序数组原地去重,这个我们旧文 如何高效地给有序数组/链表去重。 本文讲的问题应该是去重相关算法中难度最大的了,把这个问题搞懂,就再也不用怕数组去重问题了。 PS:我认真写了 100 多篇原创,手把手刷 200 道力扣题目,全部发布在 labulad…
如何高效寻找素数
素数的定义看起来很简单,如果一个数如果只能被 1 和它本身整除,那么这个数就是素数。 不要觉得素数的定义简单,恐怕没多少人真的能把素数相关的算法写得高效。比如让你写这样一个函数: 这样写的话时间复杂度 O(n^2),问题很大。首先你用 isPrime 函数来辅助的思路就不够高效…
东哥吃葡萄时竟然吃出一道算法题!
如果你在迎战秋招,东哥悄悄告诉你一些 笔试中的套路。 今天在牛客网上做了一道叫做「吃葡萄」的题目,非常有意思。 有三种葡萄,每种分别有 a, b, c 颗,现在有三个人,第一个人只吃第一种和第二种葡萄,第二个人只吃第二种和第三种葡萄,第三个人只吃第一种和第三种葡萄。 现在给你输…
如何高效进行模幂运算
今天来聊一道与数学运算有关的题目,LeetCode 372 题 Super Pow,让你进行巨大的幂运算,然后求余数。 要求你的算法返回幂运算 a^b 的计算结果与 1337 取模(mod,也就是余数)后的结果。就是你先得计算幂 a^b,但是这个 b 会非常大,所以 b 是用数…
如何实现LRU算法
就是一种缓存淘汰策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢? LRU 缓存淘汰算法就是…
如何k个一组反转链表
之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决。 对于基本数据结构的算法问题其实都不难,只要结合特点一点点拆解分析,一般都没啥难点。下面我们就来拆解一下这个问题。 …
如何运用二分查找算法
最常见的就是教科书上的例子,在有序数组中搜索给定的某个目标值的索引。再推广一点,如果目标值存在重复,修改版的二分查找可以返回目标值的左侧边界索引或者右侧边界索引。 PS:以上提到的三种二分查找算法形式在前文「二分查找详解」有代码详解,如果没看过强烈建议看看。 抛开有序数组这个枯…
经典动态规划:最长公共子序列
最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套路,比如说编辑距离。而且,这个算法稍加改造就可以用于解决其他问题,所以说 LCS 算法是值…
动态规划答疑篇
1、到底什么才叫「最优子结构」,和动态规划什么关系。 2、为什么动态规划遍历 dp 数组的方式五花八门,有的正着遍历,有的倒着遍历,有的斜着遍历。 「最优子结构」是某些问题的一种特定性质,并不是动态规划问题专有的。也就是说,很多问题其实都具有最优子结构,只是其中大部分不具有重叠…
构造回文的最小插入次数
回文串就是正着读反着读都一样的字符,在笔试面试中经常出现这类问题。 输入一个字符串 s,你可以在字符串的任意位置插入任意字符。如果要把 s 变成回文串,请你计算最少要进行多少次插入? 比如说输入 s = "abcea",算法返回 2,因为可以给 s 插入 2 个字符变成回文串 …
动态规划设计:最大子数组
但是,稍加分析就发现,这道题还不能用滑动窗口算法,因为数组中的数字可以是负数。 滑动窗口算法无非就是双指针形成的窗口扫描整个数组/子串,但关键是,你得清楚地知道什么时候应该移动右侧指针来扩大窗口,什么时候移动左侧指针来减小窗口。 而对于这道题目,你想想,当窗口扩大的时候可能遇到…
动态规划之子序列问题解题模板
子序列问题是常见的算法问题,而且并不好解决。 首先,子序列问题本身就相对子串、子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举你都不一定会,更别说求解相关的算法问题了。 而且,子序列问题很可能涉及到两个字符串,比如前文「最长公共子序列」,如果没有一定的处理经…
状态压缩:对动态规划进行降维打击
我们号之前写过十几篇动态规划文章,可以说动态规划技巧对于算法效率的提升非常可观,一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O(N^2),堪称算法界的二向箔,把各路魑魅魍魉统统打成二次元。 能够使用状态压缩技巧的动态规划都是二维 dp 问题,你看它的状态转移方程,如果计…
经典动态规划:戳气球
今天我们要聊的这道题「Burst Balloon」和之前我们写过的那篇 经典动态规划:高楼扔鸡蛋问题 分析过的高楼扔鸡蛋问题类似,知名度很高,但难度确实也很大。因此 labuladong 公众号就给这道题赐个座,来看一看这道题目到底有多难。 首先必须要说明,这个题目的状态转移方…
团灭 LeetCode 股票买卖问题
很多读者抱怨 LeetCode 的股票系列问题奇技淫巧太多,如果面试真的遇到这类问题,基本不会想到那些巧妙的办法,怎么办?所以本文拒绝奇技淫巧,而是稳扎稳打,只用一种通用方法解决所用问题,以不变应万变。 这篇文章用状态机的技巧来解决,可以全部提交通过。不要觉得这个名词高大上,文…
贪心算法之区间调度问题
435. 无重叠区间 什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。 比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,…
团灭 LeetCode 打家劫舍问题
有读者私下问我 LeetCode 「打家劫舍」系列问题(英文版叫 House Robber)怎么做,我发现这一系列题目的点赞非常之高,是比较有代表性和技巧性的动态规划题目,今天就来聊聊这道题目。 打家劫舍系列总共有三道,难度设计非常合理,层层递进。第一道是比较标准的动态规划问题…
下一页