[面试] 手写题-二分查找
二分查找
时间复杂度为 O(log n),适用于已排序的数组
二分查找的基本思想是通过不断将查找范围减半,从而快速缩小查找范围,直到找到目标元素或确定目标元素不存在。
leetcode704. 二分查找
在升序数组 nums 中寻找目标值 target,对于特定下标 i,比较 nums[i] 和 target 的大小:
如果 nums[i]=target
,则下标 i 即为要寻找的下标;
如果 nums[i]>target
,则 target 只可能在下标 i 的左侧;
如果 nums[i]<target
,则 target 只可能在下标 i 的右侧。
基于上述事实,可以在有序数组中使用二分查找寻找目标值。
循环实现
var search = function(nums, target) {let left = 0, right = nums.length - 1;// 循环查找,跳出条件left<=rightwhile (left <= right) {const mid = Math.floor((right - left) / 2) + left;const num = nums[mid];if (num === target) { // 如果目标值等于中间值,则返回中间值索引return mid;} else if (num > target) { // 如果目标值小于中间值,则右指针向左移动right = mid - 1;} else { // 如果目标值大于中间值,则左指针向右移动left = mid + 1;}}return -1;
};
递归实现
function BinSearch(arr, target,left,right) {// 终止条件if (left > right) return -1; let left = left|| 0let right = right|| (arr.length - 1)let mid = Math.floor((right - left) / 2) + left;if (arr[mid] === target) {return mid} else if (arr[mid] < target) {return BinSearch(arr, target,mid+1,right)} else {return BinSearch(arr, target,left,mid-1)}
}
参考:
b站-5分钟学会:二分查找
手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找
leetcode题解
js基本算法:冒泡排序,二分查找