二分查找概述
二分查找,想必多多少少有一点了解了,我们了解的二分查找算法:当一个数组有序的时候,我们可以使用二分算法来查找一个值;
直接比较 mid(
(left + right)/2) 和我们要查找的值target;如果nums[mid] > target就在右边查找,否则在左边查找。
但是二分查找真的如此简单吗?在什么时候才能使用二分查找呢?
使用二分查找的条件:
数组有序;其实本质是是利用二段性;简单来说,将数组分为;两个区间,一个区间内是满足某个条件;而另一个区间是满足其相反的条件的。
现在我们来通过了解二分查找的算法题,来深入探究二分查找,以及什么时候能够使用二分查找。
一、二分查找
题目解析
这道题,想必之前已经见到过了;
给定一个数组
nums和一个值target,让我们在nums数组中查找target,如果存在就返回下标;否则返回-1。
算法思路
对于这道题,我们可以使用暴力查找:让 target 和数组 nums 中所有元素一个一个比较;
暴力解法时间复杂度为 O(n);从效率上来说也是非常不错的;
但是暴力解法并没有使用到我们数组有序这一个条件;
我们这里想一下,当我们暴力查找到一个位置
mid时,区间[0,mid-1]内的值是不是都是小于mid位置的值的;区间[mid+1,n]内的值是不是都是大于mid位置的值的。简单来说就是:我们任取一个位置,这个位置的值为
x;这个位置左边区间的值都是小于x的,右边区间的值都是大于x的。那我们是不是就可以将区间划分为两部分:左边区间的值都是小于
x的右边区间的值都是大于x的这样我们任取一个位置,如果这个位置的值
x大于我们要找的值target,那就去这个位置左边区间再去找target;如果这个位置的值
x大于我们要找的值target,那就去这个位置右边区间内再去找target。
那我们大致就理解了如何去找 target;但是我们可以取 二分点 也可以取 三分点、四分点…,那如何去取 mid 呢?
这里就不叙述这个问题了,我们取 二分点 的效率是最高的。
二分整体思路:首先定义 、 分别指向区间的开始位置和结束位置。取 ()比较 位置和要查找的值 :如果 ,就去左边区间找,;如果 ,就去右边区间找,;如果 ,找到了我们要查找的值,返回结果。查找结束还没有返回结果( 和 错过去了,那就表示数组中不存在 )。


