算法思想(基于leetcode)
文章平均质量分 95
以每一种数据结构为基础,学习与其相关的算法思想,并通过leetcode刷题加以巩固。本专栏所有文章都参考labuladong算法笔记[https://labuladong.online/algo/data-structure/binary-tree-part1/]
Captain823Jack
这个作者很懒,什么都没留下…
展开
-
【算法思想·二叉树】用「遍历」思维解题 II
本文参考labuladongsuanfa笔记[如果让你在二叉树中的某些节点上做文章,一般来说也可以直接用遍历的思维模式。原创 2024-10-12 00:56:31 · 1011 阅读 · 0 评论 -
【leetcode练习·二叉树】用「遍历」思维解题 I
本文参考labuladong算法笔记[原创 2024-09-24 20:28:51 · 691 阅读 · 0 评论 -
【算法思想·二叉树】最近公共祖先问题
最近公共祖先问题,核心在于去理解p和q两个节点所处位置不同,引申出来的代码逻辑不同。原创 2024-09-23 19:00:38 · 1218 阅读 · 0 评论 -
【算法思想·二叉搜索树】后序篇
本文是承接东哥带你刷二叉树(纲领篇)的第五篇文章,主要讲二叉树后序位置的妙用,复述下前文关于后序遍历的描述:前序位置的代码只能从函数参数中获取父节点传递来的数据,而后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据。那么换句话说,一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。其实二叉树的题目真的不难,无非就是前中后序遍历框架来回倒嘛,只要你把一个节点该做的事情安排好,剩下的抛给递归框架即可。原创 2024-09-18 13:26:37 · 776 阅读 · 0 评论 -
【算法思想·搜索二叉树】构造篇
1、概述本文参考labuladong算法笔记[1、概述之前写了两篇手把手刷 BST 算法题的文章,讲了中序遍历对 BST 的重要意义,写了 BST 的基本操作。本文就来写手把手刷 BST 系列的第三篇,循序渐进地讲两道题,如何计算所有有效 BST。原创 2024-09-18 00:09:29 · 760 阅读 · 0 评论 -
【算法思想·二叉搜索树】基操篇
我们前文东哥带你刷二叉搜索树(特性篇)介绍了 BST 的基本特性,还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目,本文来实现 BST 的基础操作:判断 BST 的合法性、增、删、查。其中「删」和「判断合法性」略微复杂。BST 的基础操作主要依赖「左小右大」的特性,可以在二叉树中做类似二分搜索的操作,寻找一个元素的效率很高。# 找到目标,做点什么这个代码框架其实和二叉树的遍历框架差不多,无非就是利用了 BST 左小右大的特性而已。接下来看下 BST 这种结构的基础操作是如何实现的。原创 2024-09-17 22:11:08 · 701 阅读 · 0 评论 -
【算法思想·二叉搜索树】特性篇
所谓BST的特性,关键就是:1、BST本身特性,左孩子值 < 父节点值 < 右孩子值。2、基于1,BST中序遍历(左中右)结果是升序排列节点值,反向中序遍历(右中左)则是降序排列。原创 2024-09-11 23:49:08 · 816 阅读 · 0 评论 -
【算法思想·链表】双指针技巧秒杀七道链表题目
毫不夸张地说,双指针法可以解决80%的链表题目,剩下的20%变变样子也可以用双指针解~尤其是快慢指针fast & slow,堪称链表大杀器!原创 2024-08-22 12:26:36 · 899 阅读 · 0 评论 -
【算法思想·链表】构造链表
链表作为很常用的数据结构,很多同学在日常使用过程中或多或少都会遇到链表相关的问题,其中最常见的就是链表遍历和指针使用的问题。通过亲自手写链表,可以帮助我们深入理解链表。数据结构的工程化使用,无外乎就是增删查改,当我们亲手实现一次链表的功能,链表这个数据结构就算真正入门了。本文参考[原创 2024-08-15 11:35:33 · 780 阅读 · 0 评论 -
【算法思想·链表】单链表的花式反转方法汇总
反转单链表的迭代解法不是一个困难的事情,但是递归实现就有点难度了。如果再加一点难度,让你仅仅反转单链表中的一部分,你是否能够同时用迭代和递归实现呢?再进一步,如果让你 k 个一组反转链表,阁下又应如何应对?本文就来由浅入深,一次性解决这些链表操作的问题。我会同时使用递归和迭代的方式,并结合可视化面板帮助你理解,以此强化你的递归思维以及操作链表指针的能力。2、反转整个单链表# 单链表节点的结构单链表反转是一个比较基础的算法题,力扣第 206 题「反转链表」就是这个问题。迭代解法。原创 2024-08-23 01:40:40 · 850 阅读 · 0 评论 -
【算法思想·链表】如何判断回文链表
1、前言本文参考labuladong算法笔记[1、前言首先,寻找回文串是从中间向两端扩展,判断回文串是从两端向中间收缩。对于单链表,无法直接倒序遍历,可以造一条新的反转链表,可以利用链表的后序遍历,也可以用栈结构倒序处理单链表。具体到回文链表的判断问题,由于回文的特殊性,可以不完全反转链表,而是仅仅反转部分链表,将空间复杂度降到 O(1)。因为回文串长度可能为奇数也可能是偶数,长度为奇数时只存在一个中心点,而长度为偶数时存在两个中心点,所以上面这个函数需要传入l和r。而。原创 2024-08-25 22:05:10 · 725 阅读 · 0 评论 -
【算法思想·数组】双指针秒杀七道算法题
和。在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针,这样也可以在数组中施展双指针技巧,。原地修改数组。原创 2024-08-12 14:50:43 · 928 阅读 · 0 评论 -
【算法思想·数组】二维数组的花式遍历
本文参考labuladong算法小抄[原创 2024-08-17 17:20:22 · 492 阅读 · 0 评论 -
【算法思想·数组】前缀和
一维数组中的前缀和计算一个索引区间内的元素之和一维数组中的前缀和力扣第。原创 2024-08-11 00:42:39 · 779 阅读 · 0 评论 -
【算法思想·数组】差分数组
差分数组思想前缀和原始数组不会被修改。差分数组对原始数组进行增减差分数组思想比如说,我给你输入一个数组nums,然后又要求给区间nums[2..6]全部加 1,再给nums[3..9]全部减 3,再给nums[0..4]全部加 2,再给…一通操作猛如虎,然后问你,最后nums数组的值是什么?常规的思路很容易,你让我给区间nums[i..j]加上val,那我就一个 for 循环给它们都加上呗,还能咋样?这种思路的时间复杂度是 O(N),由于这个场景下对nums的修改非常频繁,所以效率会很低下。原创 2024-08-11 19:13:39 · 631 阅读 · 0 评论 -
【算法思想·数组】滑动窗口终极模板
滑动窗口本身思路上讲并不复杂,无非是left和right两个指针构建起一个动态window,再根据数据处理需要扩大或缩小窗口。但很多时候我们写滑动窗口总是难以尽善尽美,关键就在于对细节的把控,尤其是对窗口边界值处理不当和窗口变化机制的理解不够本文参考labuladong算法小抄[2、滑动窗口基本框架这个算法技巧的时间复杂度是 O(N),比字符串暴力算法要高效得多。这两个...处的操作分别是扩大和缩小窗口的更新操作,等会你会发现它们操作是完全对称的。原创 2024-08-18 18:45:22 · 765 阅读 · 0 评论 -
【算法思想·数组】二分搜索终极模板
1、分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解。2、注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查。3、如需定义左闭右开的「搜索区间」搜索左右边界,只要在时做修改即可,搜索右侧时需要减一。4、如果将「搜索区间」全都统一成两端都闭,好记,只要稍改条件处的代码和返回的逻辑即可,推荐拿小本本记下,作为二分搜索模板。5、搜索区间时关于越界问题的思考:不管搜索左边界还是右边界,都要考虑数组的越界,既要考虑向左越界,又要考虑向右越界。搜索左边界。原创 2024-08-18 23:42:27 · 941 阅读 · 0 评论 -
【算法思想·数组】二分搜索实战应用
本文参考labuladong算法小抄[原创 2024-08-20 01:55:47 · 1055 阅读 · 0 评论 -
【算法思想·数组】一个方法团灭nSum问题
经常刷力扣的朋友肯定知道鼎鼎有名的twoSum问题,不过除了twoSum问题,力扣上面还有3Sum4Sum问题,以后如果想出个5Sum6Sum也不是不可以。总结来说,这类nSum问题就是给你输入一个数组nums和一个目标和target,让你从nums选择n个数,使得这些数字之和为target。那么,对于这种问题有没有什么好办法用套路解决呢?本文就由浅入深,层层推进,用一个函数来解决所有nSum类型的问题。原创 2024-08-31 00:13:00 · 1055 阅读 · 0 评论 -
【算法思想·数组】一道数组去重经典算法题
本文参考labuladong算法笔记[本文讲的问题应该是去重相关算法中难度最大的了,把这个问题搞懂,就再也不用怕数组去重问题了。原创 2024-08-31 00:49:13 · 702 阅读 · 0 评论 -
【算法思想·二叉树】纲领篇
如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。原创 2024-09-03 01:39:31 · 1064 阅读 · 0 评论 -
【算法思想·二叉树】思路篇
二叉树解题的思维模式分两类:1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个traverse函数配合外部变量来实现,这叫「遍历」的思维模式。2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。原创 2024-09-03 19:22:48 · 800 阅读 · 0 评论 -
【算法思想·二叉树】构造篇
二叉树的构造问题一般都是使用「分解问题构造整棵树 = 根节点 + 构造左子树 + 构造右子树。原创 2024-09-08 00:00:10 · 734 阅读 · 0 评论 -
【算法思想·二叉树】后序篇
1、需要比较每一颗子树,要如何遍历?——后序遍历。2、如何比较每一颗子树的结构和值?——序列化的方式。3、遇到多个重复子树怎么办?——用字典来存放每个子树出现的次数。4、重视函数签名——参数是什么?返回值又是什么?原创 2024-09-09 15:49:20 · 718 阅读 · 0 评论 -
【算法思想·二叉树】序列化
1、前序遍历和后序遍历的serialize函数 就是个前序写法和后序写法的区别,而 二者的 deserialize函数 本质上都为前序写法。核心区别在于 :前者压缩时是“中左右”的顺序,故解压缩中从前向后遍历时,先构造root.left再构造root.right。后者压缩时顺序是“左右中”,故解压缩中从后向前遍历时,先构造root.right,再构造root.left。2、层序遍历:①经典的while + for框架中,while 遍历root的所有层,for遍历root某一层的所有节点。原创 2024-09-10 01:05:50 · 784 阅读 · 0 评论