二分查找?拿来吧你!
Posted 浙江技术救命稻草
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找?拿来吧你!相关的知识,希望对你有一定的参考价值。
青涩的我们也曾惧怕它,
试着接触它、拥抱它、超越它!
二分查找也称折半查找(Binary Search),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的。这里需要注意的是,我们的输入不一定是数组,也可以是数组中某一区间的起始位置和终止位置。
题目
给定一个n
个元素有序的(升序)整型数组nums
和一个目标值target
,写一个函数搜索nums
中的target
,如果目标值存在返回下标,否则返回 -1。
示例 1: 输入:nums = [-1,0,3,5,9,12], target = 9 输出:4
示例 2: 输入:nums = [-1,0,3,5,9,12], target = 2 输出:-1
提示:
-
你可以假设 nums
中的所有元素是不重复的 -
n
将在 [1, 10000]之间 -
nums
的每个元素都将在 [-9999, 9999]之间
来源:力扣(LeetCode) 链 接 : https://leetcode-cn.com/problems/binary-search 著作权归领扣网络所有。 商业转载请联系官方授权,非商业转载请注明出处。
题解
二分查找是一种在有序数组(在此不妨设置为升序)中查找特定元素的算法,我们假设要查找的元素为target
,再设置两个指针left
, right
,分别指向数组的第一个和最后一个元素。每次设定mid
位置表示中间值,并且mid = (left + right) // 2
。每次比较mid
位置的元素和target
的大小关系,如果mid
位置的元素比target
小,则说明mid
位置太靠前了,需要往后靠靠,因此下一轮查找应该left = mid + 1
,相当于不再考虑前半部分了,只考虑后半部分;如果mid
位置的元素比target
大,那就是right = mid - 1
,不再考虑后半部分了。
不断地迭代下去,找到了这个元素,就可以返回(如果元素有重复,题目可能会给出其他要求来限制答案)元素的下标了。但是如果我们最终left > right
,说明没有找到这个元素,查找失败,根据题意需要返回-1
值。
代码
Python
# 输入待查找数据
nums = list(eval(input('请输入数据:')))
# 输入需要查找的元素
target = int(input("请输入查找值:"))
# 设立left, right作为指针
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
break
if target < nums[mid]:
right = mid - 1
else:
left = mid + 1
if(left > right):
print(-1)
else:
print(mid)
课后练习
一个长度为n-1
的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n
个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1: 输入: [0,1,3] 输出: 2
示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8
限制: 1 <= 数组长度 <= 10000
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本文以讲解算法为主,代码暂且以Python为例,请同学们在搞清楚代码的情况下自行使用其他语言(包含但不限于:VB, C, C++, Java, javascript),欢迎投稿题解哦!
©浙江技术救命稻草版权所有 未经允许,请勿转载!
我是有底线的!『既然滑下来了就别忘了加群』
浙江技术救命稻草”答疑·交流“矩阵
记得点亮 “星标” 哦,不再错过任何干货!
以上是关于二分查找?拿来吧你!的主要内容,如果未能解决你的问题,请参考以下文章
4W字+上千行代码!Tomcat渗透测试方法大总结,拿来吧你!