始、前言
有时候碰到一些以前做过的算法题,还是会忘记经典解法。
是不是在记录题目的同时,也应该记录一下不同的解法呢?
一、二分查找
场景:遍历有序数组
效果:使时间复杂度O(n)的遍历操作降低为O(logn)
注意“循环不变量”规则,是左闭右闭[left, right]
还是左闭右开[left, right)
,每一轮循环结束都要处理好边界,循环的判断条件也需要对应调整。
求mid
时为了防止计算过程中的数值溢出,要使用mid = left + (right - left) / 2
而不是mid = (left + right) / 2
二、双指针法(快慢指针法)
场景:双层循环
效果:一个循环内完成两个循环的工作,使时间复杂度O(n2)的遍历操作降低为O(n)
注意指针在不同情况下的不同跳转位置,以及两个指针之间的差异
三、滑动窗口
场景:双层循环
效果:不断调节窗口的起始位置和终止位置,使时间复杂度O(n2)的遍历操作降低为O(n)
滑动窗口也可以理解为双指针法的一种,但是需要指针之间的数据,所以称之为窗口。
重点是找到移动窗口起始位置和终止位置的条件