![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode算法
文章平均质量分 91
不是很强 但是很秃
很爱盘逻辑的秃女士
展开
-
代码随想录算法day21 | 回溯算法part03 | 93.复原IP地址, 78.子集,90.子集II
在131.分割回文串中列举的分割字符串的难点,本题都覆盖了。而且本题还需要操作字符串添加逗号作为分隔符,并验证区间的合法性。可以说是 131.分割回文串131.分割回文串 (opens new windo的加强版。相信大家经过了代码随想录算法day19 | 回溯算法part01 | 77. 组合,216.组合总和III,17.电话号码的字母组合-CSDN博客。原创 2024-08-23 16:33:50 · 484 阅读 · 0 评论 -
代码随想录算法day20 | 回溯算法part02 | 39. 组合总和,40.组合总和II,131.分割回文串
本题和我们之前讲过的77.组合和216.组合总和Ⅲ组合没有数量要求元素可无限重复选取针对这两个问题,以上都做了详细的分析。并且给出了对于组合问题,什么时候用 startIndex,什么时候不用,并用17.电话号码的字母组合做了对比。代码随想录算法day19 | 回溯算法part01 | 77. 组合,216.组合总和III,17.电话号码的字母组合-CSDN博客最后还给出了本题的剪枝优化,这个优化如果是初学者的话并不容易想到。原创 2024-08-22 16:27:21 · 676 阅读 · 0 评论 -
代码随想录算法day19 | 回溯算法part01 | 77. 组合,216.组合总和III,17.电话号码的字母组合
组合问题是回溯法解决的经典问题,我们开始的时候给大家列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。从而引出了回溯法就是解决这种k层for循环嵌套的问题。然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。原创 2024-08-21 14:48:29 · 736 阅读 · 0 评论 -
代码随想录算法 | 回溯算法先导知识 | 题目分类,理论基础
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。本篇我们讲解了,什么是回溯算法,知道了回溯和递归是相辅相成的。接着提到了回溯法的效率,回溯法其实就是暴力查找,并不是什么高效的算法。然后列出了回溯法可以解决几类问题,可以看出每一类问题都不简单。最后我们讲到回溯法解决的问题都可以抽象为树形结构(N叉树),并给出了回溯法的模板。原创 2024-08-21 10:13:19 · 623 阅读 · 0 评论 -
秃姐学AI系列之:池化层 + 代码实现
一个非常简单的层——池化层!用来缓解卷积对于位置敏感的特性+减少模型数据量。原创 2024-08-20 21:31:06 · 287 阅读 · 0 评论 -
代码随想录 | 二叉树总结
在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,给大家大体分分类。涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,257.二叉树的所有路径也用了前序,这是为了方便让父节点指向子节点。所以求普通二叉树的属性还是要具体问题具体分析。原创 2024-08-20 15:17:36 · 937 阅读 · 0 评论 -
代码随想录算法day18 | 二叉树part08 | 669. 修剪二叉搜索树,108.将有序数组转换为二叉搜索树,538.把二叉搜索树转换为累加树
修剪二叉搜索树其实并不难,但在递归法中大家可看出我费了很大的功夫来讲解如何删除节点的,这个思路其实是比较绕的。最终的代码倒是很简洁。如果不对递归有深刻的理解,这道题目还是有难度的!其实思路就是,不断中间分割,然后递归处理左区间,右区间,也可以说是分治。此时相信大家应该对通过递归函数的返回值来增删二叉树很熟悉了,这也是常规操作。在定义区间的过程中我们又一次强调了循环不变量的重要性。最后依然给出迭代的方法,其实就是模拟取中间元素,然后不断分割去构造二叉树的过程。原创 2024-08-20 14:44:27 · 859 阅读 · 0 评论 -
代码随想录算法day17 | 二叉树part07 | 235.二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点
对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。首先在二叉搜索树中的插入操作,大家不用恐惧其重构搜索树,其实根本不用重构。然后在递归中,我们重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。最后依然给出了迭代的方法,原创 2024-08-14 18:11:08 · 889 阅读 · 0 评论 -
代码随想录算法day16 | 二叉树part06 | 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。可能会疑惑,什么时候递归函数前面加if,什么时候不加if,这个问题我在最后也给出了解释。其实就是不同代码风格的实现,一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。原创 2024-08-12 15:51:51 · 1152 阅读 · 0 评论 -
代码随想录算法day15 | 二叉树part05 | 530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236.二叉树的最近公共祖先
遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。同时要学会在递归遍历的过程中如何记录前后两个指针,这也是一个小技巧,学会了还是很受用的。后面我将继续介绍一系列利用二叉搜索树特性的题目。本题在递归法中,我给出了如果是普通二叉树,应该怎么求众数。知道了普通二叉树的做法时候,我再进一步给出二叉搜索树又应该怎么求众数,这样鲜明的对比,相信会对二叉树又有更深层次的理解了。原创 2024-08-10 19:17:48 · 869 阅读 · 0 评论 -
代码随想录算法day14 | 二叉树part04 | 513.找树左下角的值,112.路径总和,113.路径总和Ⅱ,106.从中序与后序遍历序列构造二叉树
递归求深度的写法,在110.平衡二叉树中详细的分析了深度应该怎么求,高度应该怎么求。递归中其实隐藏了回溯,在257.二叉树的所有路径中讲解了究竟哪里使用了回溯,哪里隐藏了回溯。层次遍历,讲解了二叉树层次遍历。所以本题涉及到的点,之前博客都讲解过,这些知识点需要灵活运用,这样就举一反三了。原创 2024-08-09 15:59:30 · 553 阅读 · 0 评论 -
代码随想录算法day13 | 二叉树part03 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222.完全二叉树的节点个数
通过本题可以了解求二叉树深度 和 二叉树高度的差异,求深度适合用前序遍历,而求高度适合用后序遍历。递归方式是一定要掌握的!这道题目要求左叶子之和,其实是比较绕的,因为不能判断本节点是不是左叶子节点。此时就要通过节点的父节点来判断其左孩子是不是左叶子了。平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。希望通过这道题目,可以扩展大家对二叉树的解题思路。原创 2024-08-07 13:42:29 · 953 阅读 · 0 评论 -
代码随想录算法day12 | 二叉树part02 | 226.翻转二叉树 ,101. 对称二叉树 ,104.二叉树的最大深度 ,111.二叉树的最小深度
介绍了递归法和迭代法,递归依然通过递归三部曲来解决了这道题目,如果只看精简的代码根本看不出来递归三部曲是如何解题的。在迭代法中使用了队列,需要注意的是这不是层序遍历,而且仅仅通过一个容器来成对的存放我们要比较的元素,知道这一本质之后就发现,用队列,用栈,甚至用数组,都是可以的。原创 2024-08-06 12:19:31 · 600 阅读 · 0 评论 -
代码随想录算法day11 | 二叉树part01 | 递归遍历 , 迭代遍历,统一迭代,层序遍历
刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。int val;大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。这里要提醒大家要注意二叉树节点定义的书写方式。在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。二叉树是一种基础数据结构,在算法面试中都是常客,也是众多数据结构的基石。原创 2024-08-05 14:48:41 · 1127 阅读 · 0 评论 -
代码随想录 | 栈与队列总结
在栈与队列系列中,我们强调栈与队列的基础,也是很多同学容易忽视的点。使用抽象程度越高的语言,越容易忽视其底层实现。我们用栈实现队列,用队列实现栈来掌握的栈与队列的基本操作。接着,通过括号匹配问题、字符串去重问题、逆波兰表达式问题来系统讲解了栈在系统中的应用,以及使用技巧。通过求滑动窗口最大值,以及前K个高频元素介绍了两种队列:单调队列和优先级队列,这是特殊场景解决问题的利器,是一定要掌握的。原创 2024-08-04 18:06:49 · 630 阅读 · 0 评论 -
代码随想录算法day10 | 栈与队列part02 | 150. 逆波兰表达式求值,239. 滑动窗口最大值,347.前 K 个高频元素
寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)原创 2024-08-04 17:57:28 · 540 阅读 · 0 评论 -
代码随想录算法day09 | 栈与队列part01 | 232.用栈实现队列,225. 用队列实现栈,20. 有效的括号,1047. 删除字符串中的所有相邻重复项
栈和队列的原理大家应该很熟悉了,。如图所示:那么这里再列出四个关于栈的问题,大家可以思考一下。以下是以Java为例。相信这四个问题并不那么好回答, 因为一些同学使用数据结构会停留在非常表面上的应用,稍稍往深一问,就会有好像懂,好像也不懂的感觉。有的同学可能仅仅知道有栈和队列这么个数据结构,却不知道底层实现,也不清楚所使用栈和队列和STL是什么关系。所以这里我再给大家扫一遍基础知识,首先大家要知道 栈和队列是STL(C++标准库)里面的两个数据结构。原创 2024-08-04 11:44:26 · 842 阅读 · 0 评论 -
代码随想录 | 字符串总结
字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。双指针法是字符串处理的常客。KMP算法是字符串查找最重要的算法,但彻底理解KMP并不容易!多写多思考!原创 2024-08-02 13:25:45 · 499 阅读 · 0 评论 -
代码随想录算法day08 | KMP思想 | 28.实现strStr(),459.重复的子字符串
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP写过KMP的同学,一定都写过next数组,那么这个next数组究竟是个啥呢?next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。原创 2024-08-02 13:05:25 · 998 阅读 · 0 评论 -
代码随想录算法day08 | 字符串part2 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串
给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world!输出: "world!hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: "a good example"输出: "example good a"解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。原创 2024-07-26 19:03:54 · 270 阅读 · 0 评论 -
代码随想录算法day07 | 字符串part1 | 344.反转字符串,541. 反转字符串II,卡码网:54.替换数字
语言中,由于 String 类是final 类型的,所以使用 String 定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。那么反转字符串依然是使用双指针的方法,只不过对于字符串的反转,其实要比链表简单一些。原创 2024-07-25 23:50:46 · 1009 阅读 · 0 评论 -
代码随想录算法 | 算法总结——双指针法
双指针法将时间复杂度:O(n^2)的解法优化为 O(n)的解法。双指针法在字符串题目中还有很多应用,后面还会介绍到。回顾一下,几道题目使用了双指针法。原创 2024-07-24 17:08:44 · 167 阅读 · 0 评论 -
代码随想录算法day06| 哈希表part2 | 454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500。所有整数的范围在 -2^28 到 2^28 - 1 之间,最终结果不会超过 2^31 - 1。输出:2时间复杂度: O(n^2)空间复杂度: O(n^2),最坏情况下A和B的值各不相同,相加产生的数字个数为 n^2。原创 2024-07-24 17:02:58 · 873 阅读 · 0 评论 -
代码随想录算法day05| 哈希表part1 | 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
为什么会想到用哈希表哈希表为什么用map本题map是用来存什么的map中的key和value用来存什么的把这四点想清楚了,本题才算是理解透彻了。原创 2024-07-22 20:24:51 · 990 阅读 · 0 评论 -
代码随想录算法| 哈希表先导知识 | 哈希表理论基础
1、当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。2、但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。3、如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!原创 2024-07-22 13:20:12 · 598 阅读 · 0 评论 -
代码随想录算法 | 链表部分总结
链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了头结点的尴尬,因为头结点没有前一个节点了。建议大家先学迭代法,然后再看递归法,因为递归法比较绕,如果迭代还写不明白,递归基本也写不明白了。这道题目可以说是链表的比较难的题目了。但代码却十分简洁,主要在于一些数学证明。使用双指针来找到两个链表的交点(引用完全相同,即:内存地址完全相同的交点)反转链表是面试中高频题目,很考察面试者对链表操作的熟练程度。来移除链表倒数第N个节点。虚拟头结点 和 双指针法。原创 2024-07-20 18:41:49 · 282 阅读 · 0 评论 -
代码随想录算法day04| 链表part2 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II
可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。原创 2024-07-20 18:31:26 · 804 阅读 · 0 评论 -
代码随想录算法day03| 链表part1 | 203.移除链表元素,707.设计链表,206.反转链表
这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。那么因为单链表的特殊性,只能指向下一个节点,刚刚删除的是链表的中第二个,和第四个节点,那么如果删除的是头结点又该怎么办呢?移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。原创 2024-07-20 16:10:08 · 772 阅读 · 0 评论 -
代码随想录算法| 链表先导知识 |链表理论基础
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。接下来说一说链表的定义。链表节点的定义,因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以大家都没有注意到链表的节点是如何定义的。而在面试的时候,一旦要自己手写链表,就写的错漏百出。// 结点的值int val;// 下一个结点。原创 2024-07-19 20:37:30 · 892 阅读 · 0 评论 -
代码随想录算法 | 数组部分总结
3、双向指针法:将其中一个指针(一般是left指针)定义为指向最终返回的数组的最后一个元素的下标,同时判断此时指向元素是否为指定元素,另一个指针(right)不断寻找非指定元素,覆盖给left指针的指定元素,最终完成left指针指向下标之前的数组为所求数组,即全非指定元素数组。一个指针指的是最终返回的没有指定元素的数组的最后一个元素下标,另一个指针去搜索不是指定元素的元素;数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力。2、数组的内存空间地址是连续的——>原创 2024-07-19 20:07:07 · 672 阅读 · 0 评论 -
代码随想录算法day02| 数组part2|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
数组算法part02原创 2024-07-18 22:08:10 · 891 阅读 · 0 评论 -
代码随想录算法day01| 数组part1|704. 二分查找、27. 移除元素
也就是[left, right] (这个很重要非常重要)while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1}else{return -1;时间复杂度:O(logn)空间复杂度:O(n)原创 2024-07-17 11:09:17 · 636 阅读 · 0 评论