二分查找的递归与非递归,必备的算法基本功

243 阅读1分钟

二分查找是查找有序的数组中某一元素的方法,是最基础也是最常用的优化方式。
我们刷算法题时,只要题目中的数组是有序的,要求时间复杂度有logn这一项元素,那基本要用到二分查找没差了。
但是,同样要掌握二分查找的递归形式,对简化代码很有帮助。

循环迭代写法

const binarySearch = function (nums, target) {
    let l = 0, r = nums.length - 1
    while (l <= r) {
        let mid = Math.floor((r - l) / 2 + l)
        if (nums[mid] > target) {
            r = mid - 1;
        } else if (nums[mid] < target) {
            l = mid + 1;
        } else {
            return mid;
        }
    }
    return -1
}

递归写法

const binarySearch = function (nums, target) {
    function find(l, r, nums, target) {
        let mid = Math.floor((r - l) / 2 + l);
        if (l > r) {
            return -1
        }
        if (nums[mid] === target) {
            return mid;
        } else if (nums[mid] > target) {
            return find(l, mid - 1, nums, target);
        } else {
            return find(mid + 1, r, nums, target);
        }
    }
    return find(0, nums.length - 1, nums, target);
}

需要注意的点
1.边界值的判断
也就是while中,左边界与右边界的关系。基本上,当数组可以有重复的值时,while循环中就是left <= right,反之则是left < right。
2.在求中间值时,这样写(right - left) / 2 + left,而不是(left + right) / 2。这样可以防止超出数字的安全范围。


记录记录!