- 博客(79)
- 收藏
- 关注
原创 【无标题】
如果最后一步爬了 1 个台阶,那么我们得先爬到 i−1,要解决的问题缩小成:从 0 爬到 i−1有多少种不同的方法。如果最后一步爬了 2 个台阶,那么我们得先爬到 i−2,要解决的问题缩小成:从 0 爬到 i−2有多少种不同的方法。因为要解决的问题都是「从 0 爬到 i」,所以定义 dfs(i)表示从 0 爬到 i有多少种不同的方法。因为要解决的问题都是「从 0 爬到 i」,所以定义 dfs(i) 表示从 0爬到 i有多少种不同的方法。递归怎么写:状态定义与状态转移方程。
2024-04-29 10:16:22
216
原创 LeetCode138题:随机链表的复制(python3)
最后,我们然后map.get(head),也就是对应的新链表的头节点,就可以解决此问题了。map.get(原节点.random),得到的就是对应的新节点.random。map.get(原节点.next),得到的就是对应的新节点.next。新节点.random -> map.get(原节点.random)从上图中我们可以发现,原节点和新节点是一一对应的关系,所以。新节点.next -> map.get(原节点.next)map.get(原节点),得到的就是对应的新节点。
2024-04-17 16:07:30
292
原创 LeetCode124题:二叉树的最大路径和(python3)
左子树找到最大的,右子树也一样,有的节点可能是负数,所以一开始ans = -inf。
2024-04-13 22:39:19
153
原创 LeetCode236题:二叉树的最近公共祖先(python3)
如果当前节点是空节点,以及当前节点是p或者是q,返回当前节点。如果左右子树都找到:返回当前节点。只有左子树:返回递归左子树的结果。只有右子树:返回递归右子树的结果。都没找到:返回空节点。
2024-04-13 21:26:12
146
原创 LeetCode437题:路径总和III(python3)
整条路径和减去target和,如果存在这样的一个前缀节点,那count+1,遍历满足等式的,就可以加count。
2024-04-13 21:14:27
505
原创 LeetCode105题:从前序与中序遍历构造二叉树(python3)
时间复杂度:n的平方,其中 n 为 preorder的长度。最坏情况下二叉树是一条链,我们需要递归 O(n)次,每次都需要 O(n)的时间查找 preorder[0]和复制数组。空间复杂度:n的平方。速度快了很多41ms。
2024-04-13 10:13:53
181
原创 LeetCode199题:二叉树的右视图(python3)
代码思路:深度优先搜索,每次总访问右子树,value_depth用dict存放,深度为索引,存放节点的值,stack从根节点[(root, 0)]开始,添加node和depth。
2024-03-15 11:52:52
328
原创 LeetCode98题:验证二叉搜索树(python3)
当前节点的值是其左子树的值的上界(最大值)当前节点的值是其右子树的值的下界(最小值)节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。
2024-03-13 16:20:14
308
原创 LeetCode108题:将有序数组转换为二叉搜索树(python3)
一个容易想到的思路:使用 nums 中最靠近中心的位置作为整棵 BST 的根节点,确保左右子树节点数量平衡。随后递归构造 nums 中下标范围为 [0,mid−1]作为左子树,递归构造 nums 中下标范围为 [mid+1,n−1]作为右子树。
2024-03-12 18:51:30
567
原创 LeetCode102题:二叉树的层序遍历(python3)
代码思路:使用队列先进先出的特性,queue[]不为空进入for循环,tmp存储每层的节点,将结果添加至res[]中。python中使用collections中的双端队列deque(),其popleft()方法可达到O(1)时间复杂度。
2024-03-12 16:01:59
477
原创 LeetCode104题:二叉树的最大深度(python3)
max(l,r)+1,而左子树和右子树的最大深度又可以以同样的方式进行计算。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)时间内计算出当前二叉树的最大深度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。一次递归调用的时间复杂度为 O(1),有 n 个结点,要进行 n 次递归调用(每个结点遍历一次),所以总的时间复杂度为 O(n) .如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为。
2024-03-12 01:06:39
211
原创 LeetCode94题:二叉树的中序遍历(python3)
换句话说,我们在遍历cur_node的时候,不能立刻对cur_node进行访问,而应该先对cur_node.left进行遍历之后(如果是后序遍历,还得是在对cur_node.right进行访问之后),才能对cur_node进行访问。在递归写法中,由于cur_node.left的遍历是通过递归调用来执行的,在关于cur_node.left的递归调用结束后,会自然地回到当前关于cur_node的遍历中,其下一行要执行的内容自然就是visit(cur_node)。时间复杂度 O(n),空间复杂度 O(n)。
2024-03-12 00:42:30
831
原创 LeetCode146题:LRU缓存(python3)
就不会创建字典,而是改用指针偏移量直接拿到属性对象。所以即节省了内存(没有字典)又节省了时间(省去查字典的过程)。Python 默认是用 dict 存储属性的,每次用 . 访问属性都需要查字典。
2024-03-09 00:27:54
721
原创 【无标题】
用最小堆初始把所有链表的头节点入堆,然后不断弹出堆中最小节点x,如果x.next不为空就加入堆中,循环直到堆为空,把弹出的节点按顺序拼接起来,就得到答案。
2024-03-08 23:40:08
145
原创 LeetCode148题:排序链表(python3)
使用快慢指针 fast = head.next、slow = head,让 fast 每次移动 2 步,slow 移动 1 步,移动到链表末尾,从而找到链表中心链节点,即 slow。而链表用在存储完全二叉树的时候,因为不支持随机访问的特性,导致其寻找子节点和父亲节点会比较耗时,如果增加指向父亲节点的变量,又会浪费大量存储空间。而对于链表排序而言,因为链表不支持随机访问,访问链表后面的节点只能依靠 next 指针从头部顺序遍历,所以相对于数组排序问题来说,链表排序问题会更加复杂一点。
2024-03-08 14:58:13
825
原创 LeetCode19题:删除链表的倒数第N个结点(python3)
我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。2.设定双指针 p 和 q,初始都指向虚拟节点 dummyHead。3.移动 q,直到 p 与 q 之间相隔的元素个数为 n。4.同时移动 p 与 q,直到 q 指向的为 NULL。1.设置虚拟节点 dummyHead 指向 head。5.将 p 的下一个节点指向下下个节点。
2024-03-08 01:25:59
296
原创 LeetCode2题:两数相加(python3)
代码思路:如果值大于10,那么就进位到下一个位置l1.next,然后再让l1+l2更新l2的值。
2024-03-07 14:57:26
191
原创 LeetCode142题:环形链表II(python3)
设链表共有 a+b个节点,其中 链表头部到链表入口 有 a 个节点(不计链表入口节点), 链表环 有 b 个节点(这里需要注意,a 和 b 是未知数,例如图解上链表 a=4 , b=5);(解析: fast 每轮走 2步)fast 比 slow 多走了 n 个环的长度,即 f=s+nb;当 fast 指针走到 f=a步时,slow 指针走到 s=a+nb步。因为每走 1轮,fast 与 slow 的间距 +1,fast 一定会追上 slow。令 fast 每轮走 2 步,slow 每轮走 1 步。
2024-03-06 20:30:46
468
原创 LeetCode141题:环形链表(python3)
然而面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。一般来讲,链表中只会有一个结点的指针域为空,该结点为尾结点,其他结点的指针域都会存储一个结点的内存地址。增加元素时需要移动指定位置及之后的所有元素,然后将新增元素插入到指定位置,如果容量不足的话还需要先进行扩容操作。数组,所有元素都连续的存储于一段内存中,且每个元素占用的内存大小相同。但连续存储的缺点也很明显,增加容量,增删元素的成本很高,时间复杂度均为 O(n)。
2024-03-06 15:11:41
366
原创 LeetCode234题:回文链表(python3)
代码思路:将链表的值复制到数组列表中,再使用双指针法判断,不断更新current_node的值。
2024-03-03 13:42:44
342
原创 LeetCode240题:搜索二维矩阵II(python3)
若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去,j++若 flag > target ,则 target 一定在 flag 所在行的上方 ,即 flag 所在行可被消去,i–当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素。当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素。当 matrix[i][j] = target 时,返回 true ,代表找到目标值。
2024-03-01 22:30:06
326
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人