三种方法进行查找
第一种是左开右开,找到就返回mid,未找到就返回-1
定义两个变量,分别为F(first) = 0 ,L(last) = nums.lenth,表示数组的下标两端
每次获取中间下标,let mid = Math.floor((f+l)/2)
如果target > nums[mid] 则目标是一定在mid的右边,即让 F = mid + 1
如果target < nums[mid] 则目标是一定在mid的左边,即让 L = mid - 1
如果 target === musp[mid] 则返回 mid
遍历数组,用 L = nums.length - 1 ,是为了避免目标在最左边情况,如【1,2,...】,1
遍历数组,用 i <= nums.length -1,是为了避免目标在最右边情况,如【1,2】,2
function search( nums , target ) {
// write code here
let F= 0, L= nums .length - 1
for(let i = 0; i <= L; i++){
let mid = Math.floor((F+L)/2)
if(nums[mid] > target){
L = mid - 1
}else if(nums[mid] < target){
f = mid + 1
}else{
return mid
}
}
return -1
}
第二种是左开右闭,目标值是跳出循环时的索引,即nums[L](L = F)
判断 目标值是否是 nums[L], return target === nums[L] ? L : -1
function search( nums , target ) {
// write code here
let F = 0, L= nums.length - 1
for(let i = 0; i < L; i++){
let mid = Math.floor((F+L)/2)
if(nums[mid] < target){
F= mid + 1
}else{
L= mid
}
}
return nums[L] === target ? L: -1
}
第三种是左闭右开,和上面一样,目标值是跳出循环时的索引,即nums[L](L = F)
但是得特别注意,这种会有一种特殊情况,会一直再循环中,那就是【1,2,...】,2
所以为了处理这种特殊情况,必须得取中间值时加一,即 mid = Math.floor((F+L +1)/2)
判断 目标值是否是 nums[L], return target === nums[L] ? L : -1
function search( nums , target ) {
// write code here
let f = 0, l = nums.length - 1
for(let i = 0; i < l; i++){
let mid = Math.floor((f+l)/2)
if(nums[mid] < target){
f = mid + 1
}else{
l = mid
}
}
returnnums[l] === target ? l : -1
}

京公网安备 11010502036488号