704. 二分查找
题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
解题思路
- 选取确定的判断区间,两种方式,层级判断target是否在
- 闭区间
[left, right]
- 半开区间
[left,right]
- 闭区间
- 在闭区间
[left, right]
中,while(left <= right),判断时是包括left===right的情况的。就可以确定下一次判断时不需要包含边界值,取序数+1/-1的值。 - 在半开区间
[left,right]
,while(left < right),即判断区间是不包含right值的。
js代码写法
- 闭区间
[left, right]
function search(nums, target){
let left = 0;
let right = nums.length - 1;
while(left <= right){ // target判断区间时[left,right]
let middle = left + Math.floor((right - left) / 2);
if(target > nums[middle]){
left = middle + 1
}else if(target < nums[middle]){
right = middle -1
}else{
return middle;
}
}
return -1;
}
- 半开区间
[left,right]
function search(){
let left = 0;
let right = nums.length; // 因为nums[right]不算在查找范围内
while(left < right){ // target判断区间时[left, right)
let mid = left + Math.floor((right - left)/2);
if(nums[mid] > target){
right = mid
}else if(nums[mid] < target){
left = mid + 1
}else{
return mid
}
}
return -1
}