自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 代码随想录算法训练营第二十一天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

不断中间分割,然后递归处理左区间,右区间,也可以说是分治。同时还要注意循环不变量。

2024-07-28 11:06:52 706

原创 代码随想录算法训练营第二十天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。二叉搜索树的迭代法比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。这里最关键的逻辑就是第五种情况(删除一个左右孩子都不为空的节点),这种情况一定要想清楚。

2024-07-28 10:52:50 782

原创 代码随想录算法训练营第十八天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

遇到在二叉搜索树上求什么最值,求差值之类的,都要思考一下二叉搜索树可是有序的,要利用好这一特点。同时要学会在递归遍历的过程中如何记录前后两个指针,这也是一个小技巧,学会了还是很受用的。求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。

2024-07-28 10:51:34 302

原创 代码随想录算法训练营第十七天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。中序遍历能更好的利用搜索树的特性中序遍历能更好的利用搜索树的特性。

2024-07-28 10:50:27 869

原创 代码随想录算法训练营第十六天 | 513.找树左下角的值、112. 路径总和、113. 路径总和||、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

前序遍历,用一个MaxDepth记录最大深度和一个result记录答案,遇到左叶子节点就处理本篇通过leetcode上112. 路径总和 和 113. 路径总和ii 详细的讲解了 递归函数什么时候需要返回值,什么不需要返回值。这两道题目是掌握这一知识点非常好的题目先从后序序列的最后一个值找到根节点,再根据根节点把中序序列分成两组,然后去除后序序列最后一个元组,根据中序序列把后序序列分成两组。

2024-07-28 10:48:35 982

原创 代码随想录算法训练营第十五天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

此题用迭代法,其实效率很低,因为没有很好的模拟回溯的过程,所以迭代法有很多重复的计算。虽然理论上所有的递归都可以用迭代来实现,但是有的场景难度可能比较大。例如:都知道回溯法其实就是递归,但是很少人用迭代的方式去实现回溯算法!因为对于回溯算法已经是非常复杂的递归了,如果再用迭代的话,就是自己给自己找麻烦,效率也并不一定高。求深度适合用前序遍历,而求高度适合用后序遍历。前序遍历,回溯,用一个int数组path记录路径,用string数字result记录结果,遇到叶子节点就终止递归,递归时要注意回溯。

2024-07-28 10:45:20 557

原创 代码随想录算法训练营第十四天 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

针对翻转二叉树,可以用一种递归,三种迭代(两种模拟深度优先遍历,一种层序遍历)的写法,如果在递归法中要使用中序遍历,第三个遍历填入的参数应该是root->left,而不是root->right相关题目推荐100.相同的树572.另一个树的子树相关题目推荐559.n叉树的最大深度给定一个 n 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。思路一:递归法public:i++) {思路二:迭代法public:if (root!while (!

2024-07-28 10:43:39 999

原创 代码随想录算法训练营第十三天 | 二叉树理论基础篇、二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法、二叉树的层序遍历

刚刚我们说过了二叉树有两种存储方式顺序存储,和链式存储,顺序存储就是用数组来存,这个定义没啥可说的,我们来看看链式存储的二叉树节点的定义方式。int val;大家会发现二叉树的定义 和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针, 有两个指针,指向左右孩子。这里要提醒大家要注意二叉树节点定义的书写方式。在现场面试的时候 面试官可能要求手写代码,所以数据结构的定义以及简单逻辑的代码一定要锻炼白纸写出来。二叉树是一种基础数据结构,在算法面试中都是常客,也是众多数据结构的基石。

2024-07-28 10:42:05 522

原创 代码随想录算法训练营第十一天 | 150.逆波兰表达式求值、239.滑动窗口最大值、347.前 K 个高频元素

寻找前k个最大元素流程如图所示:(图中的频率只有三个,所以正好构成一个大小为3的小顶堆,如果频率更多一些,则用这个小顶堆进行扫描)

2024-07-28 10:39:27 829

原创 代码随想录算法训练营第十天 | 栈与队列理论基础、232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项

top()是取栈顶元素,不会删除里面的元素,返回栈顶的引用;pop()是删除栈顶元素,返回void。

2024-07-25 21:53:51 793

原创 代码随想录算法训练营第九天 | 151.反转字符串中的单词、卡码网:55.右旋字符串、28.实现 strStr()、459.重复的子字符串

此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分,如图: (length为字符串长度)右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。其实,思路就是通过整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,单词反转:"blue is sky the"

2024-07-20 15:17:37 308

原创 代码随想录算法训练营第八天 | 344.反转字符串、541.反转字符串||、卡码网:54.替换数字

例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。在遍历字符串的过程中,让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

2024-07-20 15:12:12 351

原创 代码随想录算法训练营第七天 | 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。所以数组更加简单直接有效!注意去重a的时候不能用,否则会忽略掉-1,-1,2的元组。去重b和c逻辑应该放在找到一个三元组之后,否则会漏掉0,0,0的元组。需要注意,如果使用进行计算,使用的是int类型的加法。会使计算结果溢出。这一步需要对右边表达式其中一个数加上long使int提升为long,然后进行long类型的加法运算。

2024-07-20 14:48:37 672

原创 代码随想录算法训练营第六天 | 哈希表理论基础、242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和

总结一下,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!当题目需要使用一个无限制大小的容器来存放单个数据时,可以想到 set当题目需要使用 key value 的结构来存放数据时,key来存元素,value来存下标,那么就应该想到 map。

2024-07-16 00:07:18 801

原创 代码随想录算法训练营第四天 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07.链表相交、142.环形链表II

需要注意循环的判断,包含了奇数个和偶数个元素的判断,不需要分开写逻辑。当元素为奇数个时,会终止循环;当元素为偶数个时,会终止循环。还要注意return的时候不能return head。这题注意比较的是指针相等而不是数值相等。如果链表ab长度不一样,那么设定一个规则让链表a始终为最长的链表,这样就不用分a长b短或b长a短两套逻辑来写。

2024-07-14 21:44:51 656

原创 代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.翻转链表

在进行链表操作的时候要先进行链表的判空,否则会报错这五个接口都是链表的常见操作,可以多看看多理解。NULL是一个宏,它被定义为 0(也就是 int 型的零),或者 0L( long 型的零),或者其他零指针常数;但是一般来说我们还是把它当作整形来看待。零指针常数之所以得名,是因为他们能够被转化为空指针。nullptr,它可以被隐式转换为任何指针类型,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议用 nullptr 替代 NULL ,而 NULL 就当做 0 使用。

2024-07-14 21:36:05 535

原创 代码随想录算法训练营第二天 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵||

在这题中,使用的是相向双指针,又称对撞指针。双指针法比暴力排序降低了不少时间复杂度。在前面的移除元素题中用到了同向双指针,又称快慢指针。应该多把这两题联合起来看看,理解双指针的思想。可以直观的看到,滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。滑动窗口法可以看做是一种双指针方法的特例,两个指针都起始于原点,并一前一后向终点前进。什么情况可以用滑动窗口来解决实际问题呢?一般给出的数据结构是数组或者字符串。

2024-07-13 22:40:23 749

原创 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素

注意两种不同写法中,区间的合法性。数组是存放在连续内存空间上的相同类型数据的集合,移除元素后需要对剩余的元素进行重新移动。同时,移除元素时不能直接删除,只能对其进行覆盖。vector.earse()的时间复杂度是O(n)。

2024-07-13 14:18:42 736

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除