// 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 = Match.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 = Match.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)。
- 二分法核心在於邊界值的判斷,需要靈活運用。