数组二分查找法

67 阅读1分钟

题目描述

给定一个 n 个元素有序的(升序整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

image.png

思路

  1. 要确定查找的区间,通常进行查找的区间是:[left,right],[left,right)
  2. 确定查找区间之后,便可以确认边界问题了。
while(left<right)//[left,right)
while(left<=right)//[left,right]
  • if(target<arr[middle])

image.png

[left,right]——>right=middle-1;

[left,right)——>right=middle;

  • if(target>arr[middle])

image.png

[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
};

结果

image.png

总结

数组的二分法查找法主要考察的是边界问题的处理,只要事先确定查找的区间准则,那边界问题就好处理了。