数组是OA最爱的考试方向, 足够简单,但是又足够虐人,根据自己做过的题目总结了一下数组出现时的算法考点,以后应该会随着题目增多继续查漏补缺:
首先,做题的切入点可以先考虑sort , 看排序之后是否会让题目变得更简单而不是暴力解。
其次,就可以考虑排序/不排序时,题目的考点是哪个方向的:
1. 二分法
这种一般出现在有搜索性质的题目中,类似的简单版有找target Value, 找不合格件等。
(当然更进阶的版本就类似于COCO吃香蕉,而这就需要泛化二分所适应的题目,这里一刷的时候我就暂不考虑,之后二刷希望能力可以理解这香蕉到底要怎么吃 TT)
二分的需要掌握的就是对corner case的确定,最后一次到底是哪个值?哪个范围? 需不需要考虑进去?
这里可以参考自己day1写的笔记:
代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
2. 双指针
他的范围真的太广了,几乎所有的数组题目可能都要用到它,而其中有一个大类: 滑动窗口。我特地拿了出来放到第三点,所以这里主要考虑的是双向的两个指针移动以获得最后的答案
随想录里有 27. 移除元素, 977. 有序数组平方、等等
3. 滑动窗口
他的出现经常是需要动态考虑连续子数组的某一个状态,譬如找到最小 子数组 一定要大于某值, 或者是定下子数组大小,再加上别的约束。大概分为以下几种:
- 固定窗口
- 只有一边窗口固定
- 两边窗口都不固定
我的做题思路:
- 先扩窗口 : right 指针++
- 更新我需要维护的数据
- 如果需要缩小窗口,找到何种情况,转换成进入第二个while循环(缩窗)的编程语言
- 进入缩窗口循环后,看是否需要对结果数值进行判定
- 之后缩小窗口,left++,
- 更新需要维护的数据
滑动窗口如果过于复杂,bug肯定会如影随形,我的Debug 思想就是:
- 打下标出来,直到自己的窗口是如何在遍历中变化的
参考自己的第二天笔记:
代码随想录算法训练营第二天| 977. 有序数组平方、 209.长度最小的子数组, 59.螺旋矩阵II
5.基于双指针,遍历所有的连续子数组(不连续就是dp了)找到满足某一个条件的数组进行计算,返回结果
4. 二维数组
单独拿出来是因为我太害怕这种类型的题目了,cornercase之多。
如何运用好2个循环里的下标也是我一直在努力的目标
自认为在处理的时候,要知道第一个和最后一个点到底是不是有效的,直接带入最简单的例子进行验证!
如果边界在不停的变化,那就用变量存储,这样在遍历的时候再加一个约束即可