目录
通过Day1和Day2的算法题目,学习到了几种方法。
1.二分法
704. 二分查找
(有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件)
需要注意区间的边界,控制循环不变量规则,保持左闭右闭/左闭右开。
到底是 while(left < right)
还是 while(left <= right)
,到底是right = middle
呢,还是要right = middle - 1
呢
扩展题目
有空回头再回来做
- 35.搜索插入位置(opens new window)
- 34.在排序数组中查找元素的第一个和最后一个位置(opens new window)
- 69.x 的平方根(opens new window)
- 367.有效的完全平方数(opens new window)
2.双指针法
2.1快慢指针
27. 移除元素
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
扩展题目
待做
- 26.删除排序数组中的重复项(opens new window)
- 283.移动零(opens new window)
- 844.比较含退格的字符串(opens new window)
- 977.有序数组的平方(opens new window)
2.2左右相向指针
3.滑动窗口
209.长度最小的子数组
滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们想要的结果。
1.需要确定一个for循环中,i表示的是起始还是终止位置(后者)
2.确定起始位置如何移动
窗口内就是一个连续的子数组
扩展题目
4.模拟行为
59.螺旋矩阵II
模拟类的题目在数组中很常见,不涉及到什么算法,就是单纯的模拟,十分考察大家对代码的掌控能力。
坚持循环不变量原则,模拟顺时针画矩阵的过程,填充四条边,由外向内一圈一圈这么画下去。