前言
做到一道简单的二分题
感觉很多都忘了
记了忘,忘了记
往返循环
二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。百度百科
题型
题型基本是建立在有序数组的寻找上
就我碰到的有三种
- 不重复数组找一个数K的索引
- 可能重复数组找一个数K的最左边的索引
- 可能重复数组找一个数K的最右边的索引
PS:这些题目的前提都是有序数组,并且是递增的
每次隔一阵子写就会出现莫名奇妙的死循环
不知道什么地方要加1
不知道判断要不要加=
所以写个帖子记录下
方便之后回忆
一般的二分查找法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
function binarySearch(nums, target) { var length = nums.length; var left = 0; var right = length - 1; var mid = 0; while (left < right) { mid = (left + right + 1) >>> 1; if (target >= nums[mid]) { left = mid; } else if (target < nums[mid]) { right = mid - 1; } } return nums[left] === target ? left : -1; }
|
不重复数组找K
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
function binarySearch(nums, target) { var length = nums.length; var left = 0; var right = length - 1; var mid = 0; while (left < right) { mid = (left + right) >>> 1; if (target === nums[mid]) { return mid; } else if (target > nums[mid]) { left = mid + 1; } else if (target < nums[mid]) { right = mid - 1; } } return nums[left] === target ? left : -1; }
|
重复数组找K的最左边
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
function binarySearch(nums, target) { var length = nums.length; var left = 0; var right = length - 1; var mid = 0; while (left < right) { mid = (left + right) >>> 1; if (target > nums[mid]) { left = mid + 1; } else if (target <= nums[mid]) { right = mid; } } return nums[left] === target ? left : -1; }
|
重复数组找K的最右边
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
function binarySearch(nums, target) { var length = nums.length; var left = 0; var right = length - 1; var mid = 0; while (left < right) { mid = (left + right + 1) >>> 1; if (target < nums[mid]) { right = mid - 1; } else if (target >= nums[mid]) { left = mid; } } return nums[left] === target ? left : -1; }
|
后记
越是简单感觉越容易写错emmm