// arr 为指定数组, target 为目标元素function binarysearch(arr, target) {let left = 0let right = arr.length - 1while (left <= right) {const middlePoint = Math.floor((left + right) / 2)let middle = arr[middlePoint]if (middle > target) {right = middlePoint - 1} else if (middle < target) {left = middlePoint + 1} else {return middle}}return '数组中目标元素不存在'}
题目: 题目: 在一个二维数组中, 每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。请完成一个函数, 输入这样的一个二维数组和一个整数, 判断数组中是否含有该整数。
1 2 3 45 6 7 89 10 11 1213 14 15 16function find(arr, n) {let x = 0let y = arr[x].length - 1while (x < arr.length && y > 0) {if (n > arr[x][y]) {x++} else if (n < arr[x][y]) {y--} else {return '找到目标元素'}}return '目标元素不存在'}
这道题严格不算是二分查找, 不过用到了类似的思维。
求开方
思路: 满足 0 < sqrt < x && sqrt === x / sqrt, 转化为二分查找求 sqrt
/*** @param {number} x* @return {number}*/var mySqrt = function(x) { // 8let left = 1let right = xwhile (left <= right) {const mid = Math.floor((left + right) / 2) // 4 2 3const sqrt = x / mid // 2 4 2.7if (sqrt === mid) return sqrtif (sqrt > mid) {left = mid + 1 // 3} else if (sqrt < mid) {right = mid - 1 // 3 2}}return right // 这里返回 right 而不是 left 的原因: 用了 Math.floor, mid 会偏小, 相应 sqrt 会偏大}
有序数组的 Single Element
Leetcode : 540. Single Element in a Sorted Array (Medium)
题目描述: 一个有序数组只有一个数不出现两次, 找出这个数。