是什么?(定义)
二分查找是一种常见的查找方法,又称折半查找。
两个要求:1、数列有序 2、数列要为顺序存储结构(如数组)
为什么使用?(优点)
查找速度快,时间复杂度为O(logn),远远比顺序查找(O(n))快。
在哪里使用?(使用场景)
判断一个目标值是否在有序数列内,并且可以得到索引值。
题:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
来源:力扣(LeetCode)704题
链接:https://leetcode-cn.com/problems/binary-search
如何使用?(解法)
1、基本思想
初始两个变量来定义查找的范围,第一次查找的范围是[0,数组.length-1]。
首先判断left是否大于right,如果left>right,那就表明在指定数组中没有找到target这个值,直接返回-1;如果left<=right,那就找到找到left和right的中间索引所对应的值,通过与target进行判断,如果中间值(nums[mid])===target,直接返回中间值索引(mid);如果中间值(nums[mid])>target,说明target的值应该在中间值的左边,我们将查找范围缩小到[0,mid-1];如果中间值(nums[mid])<target,说明target的值应该在中间值的右边,我们将查找范围缩小到[mid+1,right];通过while循环查找出target的索引。
2、代码实现
var search = function(nums, target) {
var left = 0;
var right = nums.length - 1;
while (left <= right) {
var mid = Math.floor((right - left) / 2) + left;
if (nums[mid] === target) {
return mid;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
};