首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >二分查找两种实现,附详细注释

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

作者头像
double
发布2020-11-03 10:20:09
发布2020-11-03 10:20:09
5190
举报
文章被收录于专栏:算法channel算法channel

二分查找问题描述

给定一个

n

个元素有序的(升序)整型数组

nums

和一个目标值

target

,写一个函数搜索

nums

中的

target

,如果目标值存在返回下标,否则返回 -1。

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)

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

2 解法1:左闭右开

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

代码语言:javascript
复制
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:左闭右闭

代码语言:javascript
复制
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页,不管你是软件设计、算法设计、数据分析、爬虫等,基本的算法思想算是掌握了,大家加油!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二分查找问题描述
  • 2 解法1:左闭右开
  • 2 解法2:左闭右闭
  • 算法参考书
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档