二分查找
这里实现的简单的二分查找(有序数组中不存在重复元素)。
//非递归实现
const binarySearch = (arr, target) => {
let low = 0, high = arr.length - 1;
while (low <= high) {
const mid = parseInt(low + (high - low) / 2);
if (arr[mid] === target) {
return mid;
} else if (arr[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return - 1;
}
//递归实现
const binarySearch = (arr, target) => {
return helper(arr, 0, arr.length - 1, target);
}
const helper = (arr, low, high, target) => {
if (low > high) {
return - 1;
}
const mid = low + ((high - low) >> 1);
if (arr[mid] === target) {
return mid;
} else if (arr[mid] < target) {
return helper(arr, mid + 1, high, target);
} else {
return helper(arr, low, mid - 1, target);
}
}
//测试
var arr1 = [1, 3, 5, 6, 8, 10];
binarySearch(arr1, 3); //1
binarySearch(arr1, 10); //5
binarySearch(arr1, 7); //-1
查找第一个值等于给定值的元素(存在重复元素)
const binarySearch1 = (arr, target) => {
let low = 0, high = arr.length - 1;
while (low <= high) {
const mid = low + ((high - low) >> 1);
if (arr[mid] > target) {
high = mid - 1;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
if ((mid === 0) || arr[mid - 1] != target) {
return mid;
} else {
high = mid - 1;
}
}
}
return - 1;
}
//测试
var arr = [1,3,5,6,6,6,8];
binarySearch1(arr,6);//3
查找最后一个值等于给定值的元素(存在重复元素)
const binarySearch2 = (arr, target) => {
let low = 0, high = arr.length - 1;
while (low <= high) {
const mid = low + ((high - low) >> 1);
if (arr[mid] > target) {
high = mid - 1;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
if ((mid === arr.length - 1) || arr[mid + 1] != target) {
return mid;
} else {
low = mid + 1;
}
}
}
return - 1;
}
//测试
var arr = [1,3,5,6,6,6,8];
binarySearch2(arr,6);//5
查找第一个大于等于给定值的元素
const binarySearch3 = (arr, target) => {
let low = 0, high = arr.length - 1;
while (low <= high) {
const mid = low + ((high - low) >> 1);
if (arr[mid] >= target) {
if ((mid === 0) || arr[mid - 1] < target) {
return mid;
} else {
high = mid - 1;
}
} else {
low = mid + 1;
}
}
return - 1;
}
//测试
var arr = [3,4,6,7,10];
binarySearch3(arr,5); //2
查找最后一个小于等于给定值的元素
const binarySearch4 = (arr, target) => {
let low = 0, high = arr.length - 1;
while (low <= high) {
const mid = low + ((high - low) >> 1);
if (arr[mid] > target) {
high = mid - 1;
} else {
if ((mid === arr.length - 1) || (arr[mid + 1] > target)) {
return mid;
} else {
low = mid + 1;
}
}
}
return - 1;
}
//测试
var arr = [3,4,6,7,10];
binarySearch4(arr,9);//3
LeetCode相关题
1.二分查找
leetcode-cn.com/tag/binary-…
29.两数相除
leetcode-cn.com/problems/di…
33.搜索旋转排序数组
leetcode-cn.com/problems/se…
34.在排序数组中查找元素的第一个和最后一个位置
leetcode-cn.com/problems/fi…
35.搜索插入位置
leetcode-cn.com/problems/se…
50.Pow(x, n)
leetcode-cn.com/problems/po…
69.x 的平方根
leetcode-cn.com/problems/sq…