算法刷题随记
前言
突然想记录自己算法刷题的一些笔记,方便自己以后查阅。按代码随想录 (programmercarl.com)里的顺序进行学习哈,后面可能会有变动。能坚持多久我也不知道hhh。
随便说
2024年6月28日 晚上快12点
创建这个文档,然后准备去睡觉了 -V-
算法
- 二分查找
- 双指针法
- 滑动窗口
- 模拟行为
题目
数组
二分查找
704. 二分查找 - 力扣(LeetCode) 2024年6月28日 23点54分
比较简单,注意一下mid=(left+right)>>1
中的left+right
可能会溢出,可以写成:
1 | mid = left + ((right - left) >> 1); |
移除元素
27. 移除元素 - 力扣(LeetCode) 2024年6月30日 19点54分
O(n) O(1)的做法是使用双指针法
长度最小的子数组
209. 长度最小的子数组 - 力扣(LeetCode) 2024年7月2日 23点56分
使用双指针+滑动窗口思想 (若有负数则用不了)
螺旋矩阵II
59. 螺旋矩阵 II - 力扣(LeetCode) 2024年7月5日 22点45分 22点24分
模拟 它的过程就可以了,要注意边界的处理。
链表
移除链表元素
203. 移除链表元素 - 力扣(LeetCode) 2024年7月6日 晚上
移除链表,可以添加虚拟节点作为链表头,这样会简单一点,也可以直接操作链表,除此之外还可以用递归的方式,但空间复杂度会是O(n)
237. 删除链表中的节点 - 力扣(LeetCode) 2024年7月7日 11点44分
可以将给定的节点移到末尾,然后让它的上一个节点node.next = null
。惯性思维了,一直想在原地移除node😂
2095. 删除链表的中间节点 - 力扣(LeetCode) 2024年7月7日 13点53分
快慢指针,快指针一次移动两个元素,而慢指针一次移动一个
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode) 2024年7月8日 20点27分
双指针,两个指针之间间隔为n,等right到末尾了,left就是目标元素了。
面试题 02.07. 链表相交 - 力扣(LeetCode) 2024年7月8日 21点30分
可以用哈希表做。
也可以用双指针,两个指针都会遍历两个链表,-
和=
分别代表两个链表的节点,如下
A遍历===----
B遍历----===
遍历长度相同,若有交点,中间那个就是。
142. 环形链表 II - 力扣(LeetCode) 2024年7月9日 22点22分
比较难,双指针+数学😅
哈希表
有效的字母异位词
438. 找到字符串中所有字母异位词 - 力扣(LeetCode) 2024年7月11日 晚
滑动窗口
349. 两个数组的交集 - 力扣(LeetCode) 2024年7月12日 21点41分
哈希表/ 排序+双指针
202. 快乐数 - 力扣(LeetCode) 2024年7月14日 00点28分
哈希表判断是否重复,或者用快慢指针判断是否有环
454. 四数相加 II - 力扣(LeetCode) 2024年7月14日 21点13分
分组+哈希表,A+B为一组,C+D为一组(一般是等分),二重循环得到A+B存储到map中,key为“两者的和”,value为“和为key的数量”,即转化为A+B+C+D=0
-> (A+B)+(C+D)=0
看到形如:A+B....+N=0的式子,要转换为(A+...T)=-((T+1)...+N)再计算,这个T的分割点一般是一半,特殊情况下需要自行判断。定T是解题的关键。
15. 三数之和 - 力扣(LeetCode) 2024年7月16日 晚
排序+双指针:先排序,然后可以先固定一个数,然后再用双指针相向搜索(参考167. 两数之和 II - 输入有序数组)。