小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
今天我们来一道二分查找题,其实二分查找原理特别简单,但是在编码实现的时候,需要考虑很多边界情况,想一次就把二分查找写对,还是需要多练一练的~ 这道题我在[蔚来]一面的时候遇到过~
二分查找也称折半查找(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;
};
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;
};
};