东哥带你刷二叉树(后序篇)本文是承接 东哥带你刷二叉树(纲领篇) 的第四篇文章,主要讲二叉树后序位置的妙用,复述下前文关于后序遍历的描述:
前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。
那么换句话说,一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。
多说无益,我们直接看题,这是力扣第 652 题「寻找重复的子树open in new window」:
652. 寻找重复的子树 | 力扣 open in new window | LeetCode open in new window |给你一棵二叉树的根节点 root ,返回所有 重复的子树 。对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复&n ...
带权重的随机选择算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
528. Random Pick with Weightopen in new window
528. 按权重随机选择open in new window
🟠
-
剑指 Offer II 071. 按权重生成随机数open in new window
🟠
写这篇的文章的原因是玩 LOL 手游。
我有个朋友抱怨说打排位匹配的队友太菜了,我就说我打排位觉得队友都挺行的啊,好像不怎么坑?
朋友意味深长地说了句:一般隐藏分比较高的玩家,排位如果排不到实力相当的队友,就会排到一些菜狗。
嗯?我想了几秒钟感觉这小伙子不对劲,他意思是说我隐藏分低,还是说我就是那条菜狗?
我立马要求和他开黑打一把,证明我不是菜狗,他才是菜狗。开黑结果这里不便透露,大家猜猜吧。
打完之后我就来发文了,因为我对游戏的匹配机制有了一点思考。
所谓「隐藏分」我不知道是不是真的,毕竟匹配机制是所有竞技类游戏的核心环节,想必非常复杂,不是简单几个指标就能搞定的。
但是如果把这个「隐藏分」机制简化, ...
滑动窗口算法延伸:Rabin Karp 字符匹配算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
187. Repeated DNA Sequencesopen in new window
187. 重复的DNA序列open in new window
🟠
28. Find the Index of the First Occurrence in a Stringopen in new window
28. 找出字符串中第一个匹配项的下标open in new window
🟠
经常有读者留言,请我讲讲那些比较经典的算法,我觉得有这个必要,主要有以下原因:
1、经典算法之所以经典,一定是因为有独特新颖的设计思想,那当然要带大家学习一波。
2、我会尽量从最简单、最基本的算法切入,带你亲手推导出来这些经典算法的设计思想,自然流畅地写出最终解法。一方面消除大多数人对算法的恐惧,另一方面可以避免很多人对算法死记硬背的错误习惯。
我之前用状态机的思路讲解了 KMP 算法open in new window,说实话 KMP 算法确实 ...
东哥带你刷二叉树(序列化篇)读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
297. Serialize and Deserialize Binary Treeopen in new window
297. 二叉树的序列化与反序列化open in new window
🔴
-
剑指 Offer 37. 序列化二叉树open in new window
🔴
-
剑指 Offer II 048. 序列化与反序列化二叉树open in new window
🔴
Info
在开头先打个广告,我的 手把手刷二叉树课程open in new window 按照公式和套路讲解了 150 道二叉树题目,只需一顿饭钱,就能手把手带你刷完二叉树分类的题目,迅速掌握递归思维,让你豁然开朗。我绝对有这个信心,信不信,可以等你看完我的二叉树算法系列文章再做评判。
本文是承接 东哥带你刷二叉树(纲领篇) 的第三篇文章,前文 东哥带你刷二叉树(构造篇) 带你学习了二叉树构造技巧,本文加大难度,让你对二叉树同时进行「序列化」和「反序列化」。
要说序 ...
快速排序详解及应用读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
215. Kth Largest Element in an Arrayopen in new window
215. 数组中的第K个最大元素open in new window
🟠
912. Sort an Arrayopen in new window
912. 排序数组open in new window
🟠
-
剑指 Offer II 076. 数组中的第 k 大的数字open in new window
🟠
前文 归并排序算法详解 通过二叉树的视角描述了归并排序的算法原理以及应用,很多读者大呼精妙,那我就趁热打铁,今天继续用二叉树的视角讲一讲快速排序算法的原理以及运用。
#快速排序算法思路首先我们看一下快速排序的代码框架:
java 🟢cpp 🤖python 🤖go 🤖javascript 🤖
void sort(int[] nums, int lo, int hi) { if (lo >= hi) { ...
归并排序详解及应用读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
315. Count of Smaller Numbers After Selfopen in new window
315. 计算右侧小于当前元素的个数open in new window
🔴
327. Count of Range Sumopen in new window
327. 区间和的个数open in new window
🔴
493. Reverse Pairsopen in new window
493. 翻转对open in new window
🔴
912. Sort an Arrayopen in new window
912. 排序数组open in new window
🟠
一直都有很多读者说,想让我用 框架思维 讲一讲基本的排序算法,我觉得确实得讲讲,毕竟学习任何东西都讲求一个融会贯通,只有对其本质进行比较深刻的理解,才能运用自如。
本文就先讲归并排序,给一套代码模板,然后讲讲它在算法问题中的应用。阅读本文前我希望你 ...
如何同时寻找缺失和重复的元素读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
645. Set Mismatchopen in new window
645. 错误的集合open in new window
🟢
今天就聊一道很看起来简单却十分巧妙的问题,寻找缺失和重复的元素。之前的一篇文章 常用的位操作 中也写过类似的问题,不过这次的和上次的问题使用的技巧不同。
这是力扣第 645 题「错误的集合open in new window」,我来描述一下这个题目:
给一个长度为 N 的数组 nums,其中本来装着 [1..N] 这 N 个元素,无序。但是现在出现了一些错误,nums 中的一个元素出现了重复,也就同时导致了另一个元素的缺失。请你写一个算法,找到 nums 中的重复元素和缺失元素的值。
java 🟢cpp 🤖python 🤖go 🤖javascript 🤖
// 返回两个数字,分别是 {dup, missing}int[] findErrorNums(int[] nums);
比如说输入:nu ...
如何高效进行模幂运算读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
372. Super Powopen in new window
372. 超级次方open in new window
🟠
今天来聊一道与数学运算有关的题目,力扣第 372 题「超级次方open in new window」,让你进行巨大的幂运算,然后求余数。
java 🤖cpp 🟢python 🤖go 🤖javascript 🤖
// 注意:java 代码由 chatGPT🤖 根据我的 cpp 代码翻译,旨在帮助不同背景的读者理解算法逻辑。// 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 cpp 代码对比查看。int superPow(int a, List<Integer> b);
要求你的算法返回幂运算 a^b 的计算结果与 1337 取模(mod,也就是余数)后的结果。就是你先得计算幂 a^b,但是这个 b 会非常大,所以 b 是用数组的形式表示的。
这个算法其实就是广泛应用于离散数学的模幂算法,至于为什么要对 1 ...
题目不让我干什么,我偏要干什么读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
341. Flatten Nested List Iteratoropen in new window
341. 扁平化嵌套列表迭代器open in new window
🟠
提示
刷题插件open in new window 集成了手把手刷二叉树功能,按照公式和套路讲解了 150 道二叉树题目,可手把手带你刷完二叉树分类的题目,迅速掌握递归思维。
今天来讲一道非常有启发性的设计题目,为什么说它有启发性,我们后面再说。
#一、题目描述这是力扣第 341 题「扁平化嵌套列表迭代器open in new window」,我来描述一下题目:
首先,现在有一种数据结构 NestedInteger,这个结构中存的数据可能是一个 Integer 整数,也可能是一个 NestedInteger 列表。注意,这个列表里面装着的是 NestedInteger,也就是说这个列表中的每一个元素可能是个整数,可能又是个列表,这样无限递归嵌套下去……
NestedInteger ...
讲两道常考的阶乘算法题读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
172. Factorial Trailing Zeroesopen in new window
172. 阶乘后的零open in new window
🟠
793. Preimage Size of Factorial Zeroes Functionopen in new window
793. 阶乘函数后 K 个零open in new window
🔴
笔试题中经常看到阶乘相关的题目,今天说两个最常见的题目:
1、输入一个非负整数 n,请你计算阶乘 n! 的结果末尾有几个 0。
这也是力扣第 172 题「阶乘后的零open in new window」,比如说输入 n = 5,算法返回 1,因为 5! = 120,末尾有一个 0。
函数签名如下:
int trailingZeroes(int n);
2、输入一个非负整数 K,请你计算有多少个 n,满足 n! 的结果末尾恰好有 K 个 0。
这也是力扣第 793 题「阶乘后 K 个零open i ...