力扣之二分查找

62 阅读1分钟

我相信很多人都知道其思路,我也是那很多人之一 但当我开始着手写代码时,才发现自己一直报错...

重点:中间点的索引值计算,这与区间有关

这里采取左闭右闭

 /**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let l = 0
    let r = nums.length - 1
    while(l <= r){
        // mid的计算要考虑到数组长度为1、2的情况
        const mid = l + Math.floor((r -l) / 2)
        if(nums[mid] === target) {
            return mid
        }
        if(nums[mid] > target) {
            // 为什么不能使用下面第一个呢?
            // r = mid
            r = mid - 1  
        } else {
            // l = mid
            l = mid + 1
        }
    }
    return -1
};

总结:算法里你需要考虑逻辑是什么,具体每一步应该是怎么实现,对应各种情况又有不同

疑惑:虽然理解在给 r和l 赋值时要分别 -1和+1,但我还是不太能理解为啥直接赋值为 mid 不行 调试了一会儿,也暂时没发现会有啥测试用例不会通过,之后发现了会及时更新文章的