前言

突然想记录自己算法刷题的一些笔记,方便自己以后查阅。按代码随想录 (programmercarl.com)里的顺序进行学习哈,后面可能会有变动。能坚持多久我也不知道hhh。

随便说

2024年6月28日 晚上快12点

创建这个文档,然后准备去睡觉了 -V-

算法

  1. 二分查找
  2. 双指针法
  3. 滑动窗口
  4. 模拟行为

题目

数组

二分查找

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 - 输入有序数组)。