- 博客(16)
- 收藏
- 关注
原创 三大I/O模型
使用一个线程去监听多个用户连接,只有当用户连接可读可写的时候才会回调通知,告诉服务端内核空间的数据已准备就绪,并将准被就绪的客户端连接放入到集合中,这样无需遍历所有客户端连接来判断哪个客户端连接准备就绪,提高了性能。想要同时处理多个客户端请求就只能开启多线程进行处理,但是每次开启多线程就会涉及到用户空间和内核空间的切换,性能较差。客户端发出请求后不会一直阻塞等待,而是会去做其他的操作,然后采用轮询的机制每隔一段时间查询。操作放到内核空间进行,从而解决了用户空间和内核空间切换导致的性能问题。
2024-06-02 19:20:23
246
原创 代码随想录一刷(day20) |654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树
关键是理解题意,如题中给出的最大二叉树的定义优化:可以通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。依然是创建二叉树的逻辑,不过在二叉树节点的值上有所不同一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。而。
2023-12-04 08:56:59
911
原创 代码随想录一刷(day18) |513.找树左下角的值|112. 路径总和i|113.路径总和ii|106.从中序与后序遍历序列构造二叉树|105.从前序与中序遍历序列构造二叉树
相对于递归法来说,本题更适合使用层序遍历的方法。如果使用递归法将涉及到回溯。要明确递归返回的条件,当targetSum==0且遍历至于叶子节点时返回true,并且会往回递归使targetSum变为上一个节点中targetSum的值,然后再继续遍历其他路径。【本题建议在递归函数内判断完root是否为空后就将targetSum-=root.val,后面再进行叶子节点的判断,这样可以避免漏掉根节点】
2023-12-02 22:13:03
942
原创 代码随想录一刷(day17) |110.平衡二叉树|257. 二叉树的所有路径|404.左叶子之和
抓住解题要点平衡二叉树叶子节点高度差不能大于1计算二叉树高度时使用后序遍历本文我们开始初步涉及到了回溯,很多同学过了这道题目,可能都不知道自己其实使用了回溯,回溯和递归都是相伴相生的。————《代码思想录》本题与之前刷到的二叉树之类的题有很明显的不同,即:平时遇见的二叉树的题都是在某个节点上判断该节点的属性。而本题则是在某节点的父节点上判断其属性。这也是本题比较绕的一点。
2023-11-30 20:28:53
425
原创 代码随想录一刷(day16) |104.二叉树的最大深度 |111.二叉树的最小深度|222.完全二叉树的节点个数
本题和二叉树的后序遍历思路基本相同,唯一不同的就是求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。————代码随想录方法一可以计算普通二叉树的节点个数,方法二是专门针对完全二叉树的一种算法。
2023-11-29 22:18:04
388
1
原创 代码随想录一刷(day15) |层序遍历 10 |226.翻转二叉树 |101.对称二叉树 2
队列的特点是先进先出,符合层序遍历一层一层遍历的逻辑,适合广度优先遍历。而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。226.翻转二叉树leetcode链接思考反转二叉树,即将二叉树的每个节点的左右子节点进行交换代码展示if (cur!总结本题确实非常简单,但是容易被翻转二叉树“唬住”,需要明确的是翻转二叉树,就是将二叉树的每个节点的左右子节点进行翻转这也是这段递归代码的单层逻辑101.对称二叉树 2leetcode链接思考。
2023-11-29 21:28:50
465
1
原创 代码随想录一刷(day14) |二叉树递归遍历|迭代遍历
使用递归方法时按照递归三部曲步骤进行递归函数的编写思路会比较清晰,使用递归法遍历二叉树时,只需要修改单层逻辑中前中后节点的遍历顺序即可完成前/中/后序遍历的转换。前序遍历中遍历节点和处理节点可以同步处理,但是中序就无法做到同步,而后续的处理顺序正好和前序相反,只需要将前序的结果reverse即可。
2023-11-29 19:43:03
379
1
原创 代码随想录一刷(day10) |232.用栈实现队列|225. 用队列实现栈|
由于栈是先进后出,而队列是先进先出,属于需要使用两个栈才能模拟队列先进先出的情况。由于队列先进先出的特点,我们使用一个队列即可模拟栈的特点。
2023-11-19 17:55:00
72
原创 代码随想录一刷(day08) |344.反转字符串|541. 反转字符串II|151.翻转字符串里的单词|右旋字符串
本题考察了对字符串的最基本的翻转操作,并且在后面会常常用到此类操作,应牢记掌握本题是在反转链表的基础上加了一个反转的区间,只需做出一个函数完成局部反转,再明确题目要求在什么时候反转即可。在该题中的reserve方法在后续的题目中也会经常充当一个辅助方法的身份,需要熟练掌握本题中使用到的三个方法都是以前使用过的,尤其是其中反转整个字符串和局部反转字符串在前两题就写过。而快慢指针则在前面的数组-移除元素以及删除链表中倒数第n个节点中使用过,不难看出,在进行删除元素的时候考虑快慢指针还是一个不错的选择的。
2023-11-19 16:54:31
186
原创 代码随想录一刷(day07) |454.四数相加II|383. 赎金信|15. 三数之和|18 四数之和
由于本题只需要求出A[i] + B[j] + C[k] + D[l] = 0即可,并不考虑排重,是使用哈希法解决的经典题目hashMap适合记录元素出现的次数,set适合记录元素是否出现过,数组常常在元素个数一定的时候考虑四数之和看起来只比三数之和多一层for循环,还要注意本题的target的正负不确定性。
2023-11-18 23:45:21
71
1
原创 代码随想录一刷(day06) |242.有效的字母异位词|349. 两个数组的交集|202 快乐数|1. 两数之和
当遇到查看某个元素是否出现过的时候,常常要想到哈希表,尤其在元素的个数一定的情况下,应该优先考虑数组349. 两个数组的交集leetcode链接思考求两个数组的交集,本质上仍然是看数组中的哪些元素同时在两个数组中都出现过,并且要对结果进行去重。因此我们应该选用哈希结构中的set结构来解决HashSet集合中不会出现重复的key,而且其底层结构是哈希表,查询效率更高。仔细分析题目从而找出循环终止条件,一个数一直进行相同的运算规则无限循环,
2023-11-15 22:14:38
58
原创 代码随想录一刷(day04) |206.反转链表|24. 两两交换链表中的节点|19.删除链表的倒数第N个节点|面试题 02.07. 链表相交|142.环形链表II
这一题是leetcode上的一道简单题,但是我使用方法一做题做了一下午也没做出来(属实是菜了...),于是我就先用卡哥讲的双指针法(方法二)写出来了。直到第二天我再看方法一时才意识到是因为没有使用temp02指针记录cur指针所指节点的的下一个节点,这也就导致了cur.next=pre这行代码运行之后,原来的链表就从cur节点的next域断开了,所以最终只返回第一个节点:(。而我感觉递归方法就比较抽象了,我是根据方法二写出的代码的基础上进行修改才写出来的...
2023-11-13 19:59:41
88
原创 代码随想录一刷(day03) |203.移除链表元素|707.设计链表
使用虚拟头节点进行设计移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。在头节点增加元素同理。-----《代码随想录》使用虚拟头节点的方式可以使得链表头节点的增/删与其他节点的增删使用相同的逻辑去解决。
2023-11-10 23:14:15
63
1
原创 代码随想录一刷(day02) |977有序数组的平方|209长度最小的子数组|59.螺旋矩阵II
使用双指针法,可以将代码的时间复杂度由冒泡排序的O(n^2)/快速排序O(nlogn)降到O(n)在处理边界问题时坚持循环不变量原则非常重要!【二分法和本题依据坚持循环不变量原则都能很好的解决,并且思路清晰】
2023-11-09 22:26:14
69
1
原创 代码随想录一刷(day01) |704二分查找|27移除元素|有序数组的平方
从而明确使用大/小于号还是大/小于等于号,明确边界值的取舍,即坚持。
2023-11-08 21:22:22
334
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人