本篇文章为笔者的LeetCode刷题笔记。文章整体分为两部分:
1.笔者自己思考的算法及代码。
2.LeetCode官方给出的最优算法及代码。通过对比这两部分算法和代码的异同,笔者的算法思想和编程水平有了显著地提升。如果这篇文章能帮到你那真是再好不过了!
一、笔者思考的算法
A.算法
创建low,high以及mid变量用作指针;
当low<=high时,获得mid值;
当low>high时,返回-1,表示target不存在
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
low, high = 0, len(nums)-1
while low<=high:
mid = (high-low)//2+low # 此处不用high+low 是因为当数组元素很多时可能会溢出
if nums[mid]==target:
return mid
elif nums[mid]<target:
low = mid+1 # 未命中,移动low指针
else :
high = mid-1 #在比较到最后一个元素且target不存在的情况下,后两条路径
return -1 #会让low越过high,从而结束while循环
B.算法复杂度分析
时间复杂度:O(logN) 通过计算ASL(Average Search Length)可以算出二分查找的时间复杂度为对数级的。由判断树深度(二叉树性质2,性质4)也可以推出。
空间复杂度: O(1) 只用到了常数级的辅助变量low,high等,故空间复杂度为O(1)。
二.官方算法
官方算法与我的算法几乎一致
第二种算法是先排序再用双指针,很容易实现。
三.笔者小结
1.注意while循环结束的标志
2.注意区分迭代与递归法的不同。笔者的方法为迭代法。