二分查找
流程图
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;
};
};