二分查找
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
题目链接
示例 1:
输入:matrix = [[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]]target = 3输出: true
Binary Search
- 两次二分查找,先用二分查找目标所在行,然后在所在行中继续二分
- 注意查找所在行[up, down]时,用本行中最后的值和target比较
- target > nums[mid]时,在(mid, down]区间, 左开又闭
- target < nums[mid] 时,相反在[up, mid] 闭区间,因为可能在本行,所以Mid侧为闭区间
- golang
func searchMatrix(matrix [][]int, target int) bool {if len(matrix) == 0 {return false}col := len(matrix[0]) //列row := len(matrix) //行up := 0down := row - 1var mid intfor up < down { //二分查找所在行mid = up + ((down - up) >> 1)if target > matrix[mid][col-1] { //目标比中间值大,则移上边界 (mid, down]up = mid + 1}else { //目标比中间值小结果在[up, mid]之间down = mid //不能减一,可能在本行}} //最终up和down在同一行left := 0right := col - 1for left <= right {mid := left + ((right - left) >> 1)if target == matrix[up][mid] {return true}if target < matrix[up][mid] {right = mid - 1}else {left = mid + 1}}return false}
