Algorithms / LeetCode
算法刷题模型整理(一)
按链表、数组、哈希表、字符串等主题整理常见题型、核心思路和易错点。
模板
解题模型:
核心思路:
易错点:
链表
常见问题:
- dummy节点的作用
- 提供一个稳定的前驱节点
- 统一头节点和普通节点的处理逻辑
- 只是一个常数级额外节点,不会影响空间复杂度
2.
LC203 删除链表元素
解题模型:
迭代
核心思路:
检查p->next是否命中,命中则删除,p->next = p->next->next
易错点:
- 需设立哑节点dummy,否则会漏过head
- 边界条件p和p->next都不能为nullptr
- 删除时不能用if检查,而是要用while,否则连续命中时会漏
- 结束时要记得回收dummy内存
LC206 反转链表
解题模型:
迭代,三指针
核心思路:
pre指向前一个,cur指向当前节点,next保存cur->next,将cur->next指向pre,然后后移pre与cur进行迭代
易错点:
- 指针的初始化,pre初始化为nullptr,cur指向head
- 边界条件为cur!=nullptr
*初见思路:设置哑节点,迭代链表,头插法
LC024 两两交换链表中的节点
解题模型:
迭代,三指针
核心思路:
三指针,cur迭代链表,交换cur和cur->next,pre保存cur前一个节点,next保存cur->next->next
易错点:
- 边界条件,cur为nullptr或cur->next为nullptr,即剩余节点不足两个时就停止
- 交换时每一步指针操作的顺序
LC019 删除链表的倒数第N个节点
解题模型:
快慢指针
核心思路:
快指针是慢指针前面第N个节点,两个指针同时后移,直到快指针走到最后一个节点,此时慢指针即为倒数第N+1个节点
易错点:
- 设置哑节点
- 要找的是目标节点的前一个节点,这样才能删除
- 快慢指针的关系,循环终止条件
LC142 环形链表II
解题模型:
双指针,数学推导
核心思路:
Floyd Cycle Detection
先快慢指针从head出发,到达相遇点后,一个指针从head出发,另一个从相遇点出发,新的相遇点即为入环点
易错点:
- 不太用dummy,没什么大用处
- 分两个阶段,找了两次相遇点
数组
常见问题:
- 滑动窗口的使用时机
- 要求连续子区间
- 单调性,右边扩大时朝一个方向变化,左边缩小时朝反方向变化