二分查找两种实现,附详细注释

Posted Python与算法社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找两种实现,附详细注释相关的知识,希望对你有一定的参考价值。

二分查找问题描述

给定一个   个元素有序的(升序)整型数组  和一个目标值   ,写一个函数搜索   中的 ,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/binary-search

2 解法1:左闭右开

使用区间:左闭右开,详细思路见文中代码注释:

class Solution(object):
    def search(self, nums, target):
        # 刚开始的取值区间:[0,len(nums) )
        left,right=0,len(nums)
        while right - left > 1:
            mid = (left+right) //2
            # nums[0]<=...<nums[mid] <= target 
            if nums[mid] <= target:
                # 遍历后区间改变为:[mid,right)
                left = mid
            else:
                # nums[right-1]...>=nums[mid+1]>=nums[mid] > target
                # 区间调整为:[left,right)
                right = mid
        # 迭代结束后
        # right-left=1,区间为[left, right=left+1)        
        # 即nums[left]就是二分后逼近的点
        # 判断nums[left]是否等于target即可
        return left if nums[left] == target else -1

2 解法2:左闭右闭

class Solution(object):
    def search(self, nums, target):
        # 左右都是闭合区间的写法
        # 刚开始的取值区间:[0,len(nums)-1]
        left,right=0,len(nums)-1
        while left <= right:
            mid = (left+right) //2
            if nums[mid] == target:
                return mid
            # nums[0]<=...<nums[mid] < target 
            elif nums[mid] < target:
                # 遍历后区间改变为:[mid+1,right]
                left = mid + 1 
            else:
                # nums[right-1]...>=nums[mid+1]>=nums[mid] > target
                # 区间调整为:[left,mid-1]
                right = mid-1
        # 迭代结束后
        # left - right = 1,此时区间[left,right] = [left,left-1]变为空!
        # 所以返回 -1
        return -1

二分查找,是最基本的分支法的一个应用,面试中被问道的频率很高,同时边界取值特别容易出错,所以单独写为一篇文章,带有详细的注释,希望将来面试能帮助到你一点。觉得还可以,可否点个赞。

算法参考书

如果你的英文还不错,可以学习下面这本算法分析书,几乎从0开始教会你算法的基本概念,数据结构,然后基本的算法设计技术,常用到的比如分治、贪心、动归、回溯、分治定界、随机算法等。

掌握这300页,不管你是软件设计、算法设计、数据分析、爬虫等,基本的算法思想算是掌握了,大家加油!

若有需求,加我微信,备注 算法

以上是关于二分查找两种实现,附详细注释的主要内容,如果未能解决你的问题,请参考以下文章

javascript顺序数组简单实现个二分查找

ZZNUOJ_用C语言编写程序实现1154:二分搜索(附完整源码)

二分查找的代码实现

vbscript 各种自定义代码片段 - 有关详细信息,请参阅注释

二分查找的两种实现方式

二分查找的两种实现方式