二分查找的实际应用————从leetcode第35题说起

下面是leetcode第35题,难度easy:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:
输入: [1,3,5,6], 5
输出: 2

示例 2:
输入: [1,3,5,6], 2
输出: 1

示例 3:
输入: [1,3,5,6], 7
输出: 4

示例 4:
输入: [1,3,5,6], 0
输出: 0

这道题题目非常简单明了,并且已经给了我们前提条件:排序数组,让我们找到一个key或者不存在的情况下找到它的插入位置,我们可以很快反应到,这就是一个最基础的二分查找算法,实际上,这道题的代码实现跟二分查找基本一模一样,我要在这里写的并不是二分查找的一个逻辑,二分查找的具体算法实现可以看我的这篇文章:点击此处查看
这道题中跟二分查找不同的地方在于假如我们找不到key,那我们需要找到这个key应该插入的位置,这是一个非常有意思的点,我们就从这里切入来看看二分查找一些有意思的地方。
我们要是学习过二分查找后我们会明白,mid(二分查找中的中点指针)随着二分查找的进行会一直向我们的key的位置靠近,要是在数组中存在key的话,那最后mid一定会指向key,然后结束程序。但是假如不存在key呢?
假如不存在key,对于一个升序数组(数组中的数字按照从小到大排列),一共有下面这两种情况(相等的情况刚才已经提到):
1.最后的key比最后的num[mid]大
2.最后的key比最后的num[mid]小
可能大家看到这里还不是很理解,那么我们举个例子:
对于一个数组[2,4,6,8] key分别等于7和3,根据二分查找:
当key=7时,
第一次mid=1,第二次mid=2,第三次mid=3,此时指向8这个元素,由于7比8小,所以要进行的操作是high=mid-1,此时high=2,low=3,跳出循环,程序结束。
此时low的值便是我们想要的key的插入位置。
当key=3时,
第一次mid=1,第二次mid=0,此时mid指向元素2,由于3比2大,所以要执行操作low=mid+1,此时low=1,high=0,跳出循环,程序结束。
此时low的值便是我们想要的key的插入位置。
看到这里,我们好像恍然大悟,这个low便是我们最后要的结果位置,我们来仔细思考一下,这是为什么,首先,二分查找到最后一定会找到一个位置,此时low=high,例如刚才题中的元素8和元素2所在的位置,此时我们的key可能比这个元素小,也可能比这个元素大,假如比这个元素小,我们目标位置就是当前这个元素的位置,此时low不会变,也指向当前这个目标元素。
假如比这个元素大,我们的目标元素位置是当前的元素位置+1的位置,此时low根据代码会+1,因为low要朝向key移动,也是刚好等于我们要插入的位置。
综上
最后还有一个问题问大家,当我们这个数组是一个从大到小排序的数组时,这时结论又是什么呢,大家可以自己算一下
(答案还是low)

发布了19 篇原创文章 · 获赞 1 · 访问量 619
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览