【LeetCode】二分查找 & 第一个错误的版本

486 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

今天我们来一道二分查找题,其实二分查找原理特别简单,但是在编码实现的时候,需要考虑很多边界情况,想一次就把二分查找写对,还是需要多练一练的~ 这道题我在[蔚来]一面的时候遇到过~

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

704. 二分查找

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi…

【解法】头尾指针

二分查找就是从两端首尾指针开始,不断循环折半,缩小搜索范围,直到指针重合

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
var search = function(nums, target) {
    let i = 0;
    let j = nums.length - 1;
    
    while(i <= j){
        // 这里这样加的好处是防止 i+j 太大了, 是一种常见的技巧
        let index = Math.floor(i + (j-i)/2);
        
        if(nums[index] === target){
            return index;
        }else if (nums[index] < target){
            i = index + 1;
        }else{
            j = index - 1;
        }
    }
    
    return -1;
};

image.png

278. 第一个错误的版本

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/fi…

【解法】二分查找

就是二分查找,注意这里的边界情况

/**
 * Definition for isBadVersion()
 * 
 * @param {integer} version number
 * @return {boolean} whether the version is bad
 * isBadVersion = function(version) {
 *     ...
 * };
 */

/**
 * @param {function} isBadVersion()
 * @return {function}
 */
var solution = function(isBadVersion) {
    /**
     * @param {integer} n Total versions
     * @return {integer} The first bad version
     */
    return function(n) {
        let i = 1;
        let j = n;
        while(i < j){
            let mid = Math.floor(i + (j-i)/2);
            if(isBadVersion(mid)){
                j = mid;
            }else{
                i = mid + 1;
            }
        }
        return i;
    };
};

image.png