LeetCode 704. 二分查找 Binary Search 迭代法(Iteration) - Python

本篇文章为笔者的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.注意区分迭代与递归法的不同。笔者的方法为迭代法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值