二分查找
首先二分查找,通常来说就可以想象成一个二叉树,所以对于二分查找遍历来说,其算法时间复杂度是log(n),因此在考查查找算法时要求时间复杂度是log(n)的时候。二分查找过程中,通常我们会定义一个left,right指针,来分别指向第一个和最后一个元素。用mid来表示他们中间值。在二分查找中经常涉及到的问题就是:
- while循环中判断符号是否要加上等号
- mid是否要加一
- if判断中的终止条件
由于本文是建立在python的基础上,所以此处在介绍一下py小白所遇到的问题:
python中对于整除法:
mid = (low + high) // 2注意使用的是两个/
python中浮点数除法:
mid = (low + high) / 2只有一个/表示的事浮点数除法
双指针
双指针在我看来可以分为两类,其中包括了快慢指针和
左右指针。前者主要解决链表中的问题,后者主要解决数组和字符串中的问题。
1. 快慢指针
通常定义一个low与fast指针,low指针通常一次前进一步,fast通常走两步,这样可以很方便的判断链表中是否存在环。通常如果是一个数组,经过几轮循环可能也会回到原来的数,那么此题也可以尝试用快慢指针去完成。
2. 左右指针
左右指针通常用的相对较多的就是二分查找
滑动窗口
滑动窗口从字面理解为:
滑动:说明这个窗口是移动的,通常在一维数组或者字符串中从前往后滑动或者从后往前滑动
窗口:窗口简单来说就是一个长度变化的容器,他可以根据题目要求来变化窗口的大小,所以通常查找字符串中最大长子串等一系列问题
窗口通常也可以定义left和right指针分别指向窗口的开始位置和结束位置。
广度深度搜索
广度和深度搜索问题通常作用于树图问题,深度优先搜索通常伴随着递归的出现,广度优先搜索通常就是用到队列,
常见的算法就是BFS,DFS。
递归
递归通常来说遇到重复的做一件事情的时候我们通常可以想到递归,尤其是类似深度遍历那种。但是递归所占用内存空间较大,所以通常谨慎使用,一般来说能用递归实现的题目,也可以用栈去实现。
动态规划
动态规划就是创建一个状态容器dp,然后用来记录子问题的状态,从而父问题可以从子问题容器中获取而进行下一步的计算,也就是说通常考虑到子问题的话我们就要想到动态规划,动态规划也是算法中较难的部分,求出状态关系式很重要。
位运算
位运算常涉及:
1. n & (n-1)表示的是删除最后一位1
2. 异或运算 ⊕。异或运算有以下三个性质:
任何数和 00 做异或运算,结果仍然是原来的数,即 a⊕0=a。
任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。