二分查找?拿来吧你!

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

提示:

  1. 你可以假设 nums中的所有元素是不重复的
  2. n将在 [1, 10000]之间
  3. 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),欢迎投稿题解哦!


©浙江技术救命稻草版权所有 未经允许,请勿转载!


                                             

我是有底线的!『既然滑下来了就别忘了加群二分查找?拿来吧你!


浙江技术救命稻草”答疑·交流“矩阵

记得点亮 “星标” ,不再错过任何干货