二分查找两种实现,附详细注释
Python与算法社区
共 626字,需浏览 2分钟
· 2020-10-30
二分查找问题描述
给定一个 个元素有序的(升序)整型数组 和一个目标值 ,写一个函数搜索 中的 ,如果目标值存在返回下标,否则返回 -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]<=...
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]<=...
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页,不管你是软件设计、算法设计、数据分析、爬虫等,基本的算法思想算是掌握了,大家加油!
若有需求,加我微信,备注 算法
评论
15种时间序列预测方法总结(包含多种方法代码实现)
向AI转型的程序员都关注了这个号👇👇👇在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(
机器学习AI算法工程
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
原来Matplotlib能画股票K线图!!附代码
之前在一篇文章中提到Matplotlib可视化,甚至可以用来画股票K线图,许多同学也在问代码,这次来发个文回应下。Python用matplotlib绘制K线图,需要配合talib、numpy、mpl_finance等第三方库来使用,效果展示如下:简单讲讲K线图的结构,我不搞股票,所以不太懂,特地查了
Python大数据分析
9
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0