- 博客(20)
- 收藏
- 关注
原创 112. 路径总和 - 力扣(LeetCode)
依旧外部变量记录sum,当等于targetSum并且是叶子节点是就设置答案,前序位置放进入节点时加入该节点值,后序位置放离开该节点时减去该节点值。这里使用深度优先遍历更简单一些,广度的话要同时多个枝条的总值,最后再检查一遍,太麻烦了。树的遍历有两种:1. 深度优先遍历 2. 广度优先遍历。深度呢,就是一条遍历完,去另外一条,适合这种有关单个枝条的题目。属于遍历一遍可以得到答案的题,树的遍历一般都是通过递归来实现。
2025-10-03 18:24:21
205
原创 108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
注意三点:1. 索引传递依照左闭右开的原则 2. begin、mid、end设置好 3.base case。由于数组升序排序,选择数组中间的mid元素当根结点,然后左子树和右子树是同类型的子问题。这题可以分解问题得到答案。
2025-10-02 19:07:31
162
原创 104. 二叉树的最大深度 - 力扣(LeetCode)
解法二:分解问题,如果想知道根结点的最大深度,如果知道左子节点的最大深度和右子节点的最大深度,进行一个比较,就知道结果了。那么再把子节点的问题分解下去。解法1:遍历二叉树的所有节点,记录下深度的最大值(前序刚进入、后序要离开、中序刚遍历完左子树,所以在前序进入位置深度++,后序离开位置深度--)一个是分解问题得到答案,通过得到子问题答案到最终问题答案,需要返回值来解决。这就实现了一个,能得到最大深度的函数,坚信它,然后用就行了。一个是遍历一遍得到答案,依旧外部变量记录,不需要返回值。
2025-10-02 19:01:42
125
原创 101. 对称二叉树 - 力扣(LeetCode)
和100题一样的思想,只不过传入方式不同,同时传入的left和right总是轴对称的,和100题处于同一个位置一样。
2025-09-30 16:27:57
108
原创 100. 相同的树 - 力扣(LeetCode)
前序、中序、后序,三个位置的代码执行时机分别是,未遍历过该节点的子树、仅遍历过该节点的左子树、全遍历过该节点的左右子树。可以看出后序位置是最强大的,但这题用不到后序,前序即可解决问题,只需要看两个树的当前节点是否一致就可以了,用外部变量来记录。属于遍历一遍能得到答案的题,但用递归遍历,需要理解递归思想。
2025-09-30 16:17:32
147
原创 88. 合并两个有序数组 - 力扣(LeetCode)
用三个指针,两个倒序比对nums1和nums2的尾元素,大的放入nums1的真正尾端。一个用来倒序完善nums1的真尾。直到把nums2全部放入nums1为止。(这个方法有点钻空子了,题目要考察原地修改,但原地修改总是有些费脑子的,所以利用vector的重载赋值运算符,把新数组的元素赋给nums1)解法1:声明一个新数组,双指针轮流比较nums1和nums2的元素大小,小的放进去,随后一一放入,最后把新数组赋值给nums1。解法2:在灵茶山艾府的题解学到的。属于遍历一遍能得到答案的题。
2025-09-30 15:37:59
146
原创 70. 爬楼梯 - 力扣(LeetCode)
爬楼梯中,假如n == 30,那么最后一步要么是上一个台阶或者是上两个台阶,两种方法没有重叠,子问题就是 n == 29 和 n == 28,n == 30 的结果就是 (n== 29结果 + n == 28结果),子问题也去找子问题的答案。(动态规划时间复杂度一般很高,因为会有大量答案被重复计算,比如n == 29 后面的子问题,n == 28 也要再算一次,所以需要优化记录被算过的答案,这里用记忆化搜索,一个外部变量来记录,也有其他优化的方法)重点:分清子问题是什么,子问题之间是否独立。
2025-09-29 12:44:51
103
原创 69. x 的平方根 - 力扣(LeetCode)
根据题目要求,该数的平方根如果刚好是整数就返回,如果是小数,就舍弃,也就是返回大于平方数的前一个数。也属于遍历一遍就能得到答案的题。
2025-09-29 12:21:09
213
原创 67. 二进制求和 - 力扣(LeetCode)
题目给的二进制的字符串类型,字符串不能用于数值计算,利用底层存储的ASCII码值来转为数值,例如 '1' - '0' = 1,'1'就被转为数值1了。进位处理题目,处理好val和carry就没问题(倒序计算方便,后面翻转一下就行)
2025-09-29 12:10:18
182
原创 66. 加一 - 力扣(LeetCode)
常规的倒序处理数组元素加法。主要集中于加法的值和进位的问题。这题特殊一个点在于,第一位的加法如果还有进位,需要把进位头插。
2025-09-27 19:21:52
134
原创 14. 最长公共前缀 - 力扣(LeetCode)
确定逻辑上遍历的方式。保证每个字符串的前缀字符相同,必须要一个个比对,固定第一个字符,遍历所有string,那么字符在外层,string在内层。如果有字符串和固定的第一个字符不匹配,记录false返回ans,否则记录true加入字符进ans。这里是一个vector<string>,那么结构就是vector数组里每个元素存的string。因为是所有字符串的前缀比对,应以最短的字符串为遍历次数,否则会越界。常规的二维不同类型元素判断。
2025-09-21 15:10:56
242
原创 数据结构与算法
不过据labuladong说,工程中几乎不会用到静态数组,一般是动态数组(不过是在静态数组的基础上增加了扩/缩容和增删查改的API而已)。不过但凡是数组,都是这同样的好处和坏处。总之,深刻理解了数组和链表两者的优缺点,以及它们的内存处理方式,也就几乎学会了整个数据结构的内容。随后,只需要掌握各个数据结构们的特性了,做到扬长避短。其他的数据结构,诸如队列、栈、树、图、堆,也只是它们二者之一的衍生品而已。后面的数据结构都是在数组和链表框架下的问题了,结构细分化而已,怎么都逃脱不开这两个老祖宗。
2025-09-01 20:57:39
137
原创 同步与异步
同步、异步都是一种编程概念,描述的是两个任务之间的关系。如果说在同一进程中,任务一和任务二是同步的关系,那么任务一和任务二是保持一个先后的顺序依次执行,任务二需要等待任务一从开始到结束后才可以开始执行,平常的代码顺序执行就是如此。执行任务一时,任务二并不会被任务一阻塞等待。假如任务一有个io请求,那么任务一需要等待数据到达缓冲区,才可以执行io操作,在这个等待数据的时间,可以继续执行任务二,等数据准备好后,再去根据事件循环调度完成任务一。1. 回调函数 (Callback)2. 事件驱动 (Event-dr
2024-11-30 20:58:55
290
原创 recv、send与网络io
1.通过send函数将数据拷贝至套接字的发送缓冲区2.如果是TCP协议,数据会被拆分为TCP数据段并添加TCP报头3.如果是UDP协议,数据会被拆分为UDP数据报,并添加UDP报头4.进入网络层协议,加上ip报头5.进入链路层协议,加上链路层的帧头,MAC地址等6.数据被放入网卡驱动的队列中7.网卡通过DMA方式直接读取,并通过物理层(电缆、光纤、无线信道)发送出去。
2024-11-26 15:42:39
1015
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅