一.查找表
考虑的基本数据结构
- 第一类: 查找有无–set
元素’a’是否存在,通常用set:集合 - 第二类: 查找对应关系(键值对应)–dict
元素’a’出现了几次:dict–>字典 - 第三类: 改变映射关系–map
通过将原有序列的关系映射统一表示为其他
二. 对撞指针
遍历时多用索引,而不要直接用值进行遍历
三. 滑动数组
e.x.
固定滑动数组的长度为K+1,当这个滑动数组内如果能找到两个元素的值相等,就可以保证两个元素的索引的差是小于等于k的。如果当前的滑动数组中没有元素相同,就右移滑动数组的右边界r,同时将左边界l右移。查看r++的元素是否在l右移过后的数组里,如果不在就将其添加数组,在的话返回true表示两元素相等。
四、二分查找
class Solution:
def firstBadVersion(self, arr):
# 第一点
lo, hi = 0, len(arr)-1
while lo < hi:
# 第二点
mid = (lo+hi) // 2
# 第三点
if f(x):
lo = mid + 1
else:
hi = mid
return lo
-
第一点:lo和hi分别对应搜索的上界和下界,但不一定为0和arr最后一个元素的下标。
-
第二点:因为Python没有溢出,int型不够了会自动改成long int型,所以无需担心。如果再苛求一点,可以把这一行改成
mid = lo + (hi-lo) // 2
# 之所以 //2 这部分不用位运算 >> 1 是因为会自动优化,效率不会提升
- 第三点: 比较重要的就是这个f(x),在带入模板的情况下,写对函数就完了。