Javascript算法:二分查找法

193 阅读2分钟

二分查找

流程图

1.jpeg

javascript实现

    window.onload = function() {  
        // 首先定义一个有序数组  
        let arr = [1,2,3,4,5,6,7,8,9];  
        // 你要查找的元素  
        let find = 5;  
        // 取到右端点的值  
        let right = arr.length - 1;  
        // 左端点  
        let left = 0;  
  
        while ( right >= left) {  
          // 去除中间值  
          let mid = Math.floor( (left + right) /2);  
          if(arr[right] < find || arr[left] > find) {  
              alert("所查找的值不在数值中");  
          }  
          if(arr[mid] === find) {  
            alert('找到了');  
            return find  
          }else if(arr[mid] > find) {  
              right = mid -1;  
          }else {  
              left = mid + 1;  
          }  
        }  
      }

实战算法题:leecode 278.第一个错误版本

题目 你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
实例1

输入:n = 5, bad = 4  
输出:4  
解释:  
调用 isBadVersion(3) -> false   
调用 isBadVersion(5) -> true   
调用 isBadVersion(4) ->   
所以,4 是第一个错误的版本。

实例2

输入: n = 1, bad = 1
输出: 1

解题答案

var solution = function(isBadVersion) {
    /**
     * @param {integer} n Total versions
     * @return {integer} The first bad version
     */
    return function(n) {
        // 首先定义边界
        let left = 1;
        let right = n;
        // 循环遍历
        while (right >= left) {
            // 定义一个中间的量
            let mid = Math.floor((right + left) / 2);
            // 判断是否存在,如果存在的话就让右边的边界调整,不存在就让左边的边界调整,直到找到第一个,就返回left边界
            if(!isBadVersion(mid)) left = mid + 1;
            if(isBadVersion(mid)) right = mid - 1;
        }
        return left;
        
    };
};