// typescript版本的
/**
* 二分法查找
* @param {Array<number>} -nums 查找的数组 如[1,2,3,4]
* @param {number} key -需要查找的值 如3
* @return {number} -返回下标或者-1(未找到)
*/
function binarySearch(nums: Array<Number>, key: Number): Number {
let l = 0; // 左边界 0最小
let r = nums.length - 1; // 右边界 nums.length-1 最大
// 终止条件左边
while (l <= r) {
let m = l + Math.floor((r - l) / 2); // 取中间下标
// let m = Math.floor((l + r) / 2); // 这种有可能会溢出
if (nums[m] === key) {
// 中间值等于所要查找的值
return m;
} else if (nums[m] > key) {
// 中间值大于所要查找的值 右边界更改
r = m - 1;
} else {
// 中间值小于所要查找的值 左边界更改
l = m + 1;
}
}
return -1;
}
// 编译后的
/**
* 二分法查找
* @param {Array<number>} -nums 查找的数组 如[1,2,3,4]
* @param {number} key -需要查找的值 如3
* @return {number} -返回下标或者-1(未找到)
*/
function binarySearch(nums, key) {
var l = 0; // 左边界 0最小
var r = nums.length - 1; // 右边界 nums.length-1 最大
// 终止条件左边
while (l <= r) {
var m = l + Math.floor((r - l) / 2); // 取中间下标
// let m = Math.floor((l + r) / 2); // 这种有可能会溢出
if (nums[m] === key) {
// 中间值等于所要查找的值
return m;
}
else if (nums[m] > key) {
// 中间值大于所要查找的值 右边界更改
r = m - 1;
}
else {
// 中间值小于所要查找的值 左边界更改
l = m + 1;
}
}
return -1;
}
总结
- 二分法只适用于类似[1,2,3,4]的有顺序的数组查找。
- 二分法时间复杂度O(log2n)。
- 二分法核心在于边界值的判断,需要灵活运用。