题目描述
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路
- 要确定查找的区间,通常进行查找的区间是:[left,right],[left,right)
- 确定查找区间之后,便可以确认边界问题了。
while(left<right)//[left,right)
while(left<=right)//[left,right]
if(target<arr[middle])
[left,right]——>right=middle-1;
[left,right)——>right=middle;
if(target>arr[middle])
[left,right]——>left=middle+1;
[left,right)——>left=middle+1;
代码(代码采取的是左闭右开准则即[left,right))
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
//定义l两个指针:left,right
let left=0,right=nums.length-1;
//如果数组元素只有一个,并且元素值为target,直接返回left
if(left==right&&target==nums[right]){
return left;
}
//否则
while(left<right){
//取中间点
let middle=left+parseInt((right-left)/2);
//如果target小于nums[middle]
if(target<nums[middle]){
right=middle;
}else if(target>nums[middle]){ //如果target>nums[middle]
left=middle+1;
}else{ //如果等于nums[middle]
return middle;
}
}
return -1; //没有查找到target值返回-1
};
结果
总结
数组的二分法查找法主要考察的是边界问题的处理,只要事先确定了查找的区间准则,那边界问题就好处理了。