二分查找两种实现,附详细注释
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页,不管你是软件设计、算法设计、数据分析、爬虫等,基本的算法思想算是掌握了,大家加油!
若有需求,加我微信,备注 算法
以上是关于二分查找两种实现,附详细注释的主要内容,如果未能解决你的问题,请参考以下文章
ZZNUOJ_用C语言编写程序实现1154:二分搜索(附完整源码)