74. 搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。


    示例 1:
    74. 搜索二维矩阵 - 图1
    输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
    输出:true

  1. //转换为一维的数组,全部遍历一遍二分,
  2. //时间Ologm*n,空间O1
  3. func searchMatrix(matrix [][]int, target int) bool {
  4. m, n := len(matrix), len(matrix[0])
  5. l, r := 0, m*n
  6. for l < r {
  7. mid := (l + r) / 2
  8. if matrix[mid/n][mid%n] < target {
  9. l = mid + 1
  10. } else if matrix[mid/n][mid%n] > target {
  11. r = mid
  12. } else {
  13. return true
  14. }
  15. }
  16. return false
  17. }
//从右上角遍历,局部剪枝,复杂度O(m+n),空间O1
func searchMatrix(matrix [][]int, target int) bool {
    row := len(matrix)-1            //横的减少
    col:= 0                            //纵的增加

    for row >= 0 && col < len(matrix[0]){
        if matrix[row][col] == target{
            return true
        } else if matrix[row][col] > target{
            row--
        } else if matrix[row][col] < target{            //二分法要注意写else
            col++
        }
    }
    return false
}