开始
小伙伴们大家好,说到算法大家都不陌生,在我们的面试过程中或多或少都会遇到一些算法相关的内容,很多刚入行的小伙伴对于算法可能比较陌生,这里我会带领大家从最简单的算法题开始上手,从简单的算法与数据结构开始到后面Vue,React中用到的diff算法,任务调度等。让大家彻底掌握前端常用的算法。
接下里我们就进入到我们的实战部分!
首先看题目
题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
分析
这是力扣上一道非常简单的算法题,首先我们分析一下题目,大概意思就是,我们有一个数组nums,我们的nums里面有n个数字,我们的需求是将我们的目标值target(target也是一个数字),我们需要讲我们的target放到我们的数组(nums)中进行查询,查询我们的数组中是否有我们的目标值(targer),如果有就返回我们的目标值在数组中的下标。如果没有就返回-1
看到这里大家是否觉得这个需求有点像我们玩过的一个叫猜数字的游戏
小明定义一个0-100之间的数字,让我们去猜数字是多少,我们最快的办法(不考虑运气的情况下)一定是将0-100对等去分然后猜,这样以此类推就能最快的猜出定义的数字。我们的二分查找跟我们这个游戏思路一样,也是这样进行查看
然后先拿到我们数组的第一个下标(low)和最后一个下标(high)。
然后while循环我们的数组。
定义中间值(mid)将我们两个相加之和相除赋值给我们的中间值。
拿到中间值之后就进行判断
1.判断我们的目标值(target)是否等于我们的当前循环到的数字(nums[mid])
如果相等就return出我们的mid
如果不相等就继续判断我们目标值(target)是否大于的我们当前循环到的数字(nums[mid])
2.如果我们的目标值(target)大于我们的(nums[mid])就说明我们需要向后继续找
这里我们就需要将我们的第一个下标像后移,移到我们前循环到的数字加上1,
3.如果我们的目标值(target)小于我们的(nums[mid])就说明我们需要向前继续找
这里我们就需要将我们最后一个下标向前移动,移到我们当前循环到的数字上减去1
最后在我们的循环外面return一个-1因为如果循环里面一直没有找到,到我们的循环结束之后我们就可以直接return一个-1表示数组中没有我们需要的数字。
看到这里小伙伴们是否可以理解了呢?
接下里我们就用代码实现一下
首先我们定义我们的第一个和最后一个下标
var search = function(nums, target) { // 首先定义数组第一个数字的下标和最后一个数字的下标 let low = 0, high =nums.length -1; };
然后循环我们的数组,判断条件就是我们的high需要大于我们的low
// 循环我们的数组,判断条件就是我们的high需要大于我们的low while(low <= high){ }
// 定义我们的中间值,这里为了方便我们就将当前循环的值定义一下
let mid = (low + high)>>1 // 当前循环的值 let num = nums[mid]
如果我们循环的值等于我们的target
// 如果我们循环的值等于我们的target if(num ===target){ return mid }
如果我们的target大于我们的num
else if(num <target){ // 我们的target大于我们的num就说明我们需要向后继续找 low = mid + 1 }
如果都不成立则说明我们的targget小于我们的num
else { // 反之说明我们的targget小于我们的num 就需要我们将最大值等于我们的mid(猜测值)减一 high = mid -1 }
最后在我们的最外层return-1
我们执行一下代码
最后提交一下我们的代码
到这里我们的二分查找就已经完成了。
如果你觉得这篇文章对您有帮助就三连支持一下呗。