前言
主要是记录一下刷算法的思路,便于后续回顾思路,具体解法网站上看就行了
[link](代码随想录 (programmercarl.com))
1. 数组
1.1 二分法
-
前提:数组有序
-
本质:可以理解为(首尾)双指针法
-
实现思路:
- leftIndex,rightIndex首尾指针,计算出中位middle指针.根据middle与target的大小来控制左右指针的移动,单次移动直接将left/right跨越到middle±1的位置
- while循环:left<=right
-
LC
-
- easy
-
- 注意用特例来确定返回left or right
-
34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
- 分别找左右边界,注意好一共有几种情况
-
- 同样用特例来确定返回left or right
-
-
总结
- 后续写
1.2 (快慢)双指针法
-
实现思路:
- 初始时快慢指针均在0位置,快指针用于遍历寻找新元素,慢指针用于在指定位置更新快指针的元素
- 外层for循环用于更新快指针的位置
- 内层if判断是否更新慢指针的位置
-
注意:厘清思路.什么时候满足if移动慢指针,一定要搞清楚这一点
-
LC
1.3 滑动窗口
-
实现思路:
- 外层for循环为滑动窗口终止位置的遍历0-nums.size()
- 内层while循环的中止条件为窗口内sum<target
-
注意:
- for每次移动终止位置把新增的值加到窗口中
- while每次移动起始位置厚把滑走的值从窗口中去掉
-
LC
- 209. 长度最小的子数组 - 力扣(LeetCode)
- 三目运算符再熟练熟练,这题还得再做
- 904. 水果成篮 - 力扣(LeetCode)
- [ ]
- 76. 最小覆盖子串 - 力扣(LeetCode)
- [ ]
- 209. 长度最小的子数组 - 力扣(LeetCode)
2. 链表
struct ListNode{
int val; //节点存储元素
ListNode *next; //指针指向下一个节点
ListNode(int x) : val(x), next(NULL) {} //构造函数
}
-
链表操作
- 添加节点
- 删除节点