很多前端的同学对数据结构和算法这块没有太多的概念,很多leetcode的题目看不懂,有时候可能看了题解也不知道是什么意思。下面根据题目来练习一下二分查找
704. 二分查找
题目
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
题解
题目中给我们一个排序数组和一个目标值,然后找到这个目标值,返回对应的位置,如果没有找到则返回-1。这个我们就可以利用二分查找来解决那可就很简单了(不清楚二分的可以先去看看二分查找之万变不离其宗)。
示例1
我们先用图来演示下示例1
首先我们需要两个指针:一个左边指针(开始起点)left
,也就是数组的第一个索引"0".一个右边指针(结束索引)right
,也就是数组的最后一个索引nums.length - 1
。同时我们还需要一个中间点mid
.
可以发现,mid
是处在索引为2的地方,这是为什么呢?因为left
和right
的索引的一半是2.5
没有对应的索引,所以可以通过Math.floor
解决这个问题。然后我们在通过mid
对应的值和target
的值进行对比。
- 如果
mid
对应的值和target
对应的值相等,说明找到了,则直接返回即可 - 如果
mid
对应的值小于target
对应的值,说明target
的值在(mid, right]
这个区间内,则将left
直接移动到mid
的下一位 - 如果
mid
对应的值大于target
对应的值,说明target
的值在[left, mid)
这个区间内,则将right
直接移动到mid
的上一位
比如我们的这个案例中,target
是9,mid
对应的是3,所以需要改变left
的位置。我们通过图来看下完整的过程
当mid
对应的值是9,和target
一样的时候,则直接返回。
那如果没有找到呢?我们来看下示例2
示例2
示例2中target
变成了2.我们再来看下图
当mid
对应的值为3时,比target
大,所以需要改变right
的位置.right
的位置确认后,我们就可以确认mid
的位置,此时它和left
的对应的值是一样的,比target
小,所以需要改变left
的位置。
根据同样的步骤走完之后,此时left
,right
,mid
,在同一个位置,但是还是没有找到target
的值,而且mid
对应的值比target
小,,所以需要改变left
的位置。这样的话,left
就大于right
了,那就不可能找到了,则return -1
完整代码
var search = function (nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
const mid = Math.floor(left + (right - left) / 2);
if (nums[mid] === target) {
return mid;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
}
}
return -1;
};
欢迎大家点赞评论,大家一起学习一起进步!!!