leetcode74搜索二维矩阵

leetcode74 Search a 2D Matrix

Posted by BY on August 21, 2018

前言

真菜的我。

正文

问题来源

本问题来自leetcode上的74题。用go语言做的

问题描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: 每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。

示例 1:

输入:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 3
输出: true

示例 2:

输入:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 13
输出: false

分析:

本人的想法是采用二分搜索来查找,首先根据行二分找到具体行,然后根据列二分找到具体值。 本人写的Go代码如下:

func searchMatrix(matrix [][]int, target int) bool {
	rowb := 0
	l := len(matrix)
	rowe := l - 1
	rowm := (rowb + rowe)/2
	if l == 0 {
		return false
	}
	for ; rowe > rowb; rowm = (rowb+rowe)/2 {
		cur := matrix[rowm][0]
		if target == cur {
			return true
		} else if target > cur {
			next := rowm + 1
			if (next<l)&&(target>=matrix[next][0]) 	{
				rowb = rowm + 1
			} else {
				break
			}
		} else {
			rowe = rowm - 1
		}		
		fmt.Printf("b:%d e:%d\n",rowb, rowe)
	}
	colb := 0
	cole := len(matrix[0]) - 1
	colm := (colb + cole) / 2
	for ; colb <= cole ; colm = (colb+cole)/2 {
		cur := matrix[rowm][colm]
		if target == cur {
			return true
		} else if target > cur {
			colb = colm + 1
		} else {
			cole = colm - 1
		}	
	}
	return false
}

这题的思路很简单,利用矩阵行列分别有序的性质,我们从第0行的最右端开始搜索,两种情况:

  1. 如果当前的数比target大,则说明target必然在target的左边,则搜索其左边的位置
  2. 如果当前的数比target小,则说明和target相等的数必然不在这一行,因此往下一行搜索。
  3. 如果当前的数和target相等,则说明找到了这个target
func searchMatrix(matrix [][]int, target int) bool {
    n := len(matrix)
    if n <= 0 {
        return false
    }
    m := len(matrix[0])
    if m <= 0 {
        return false
    }
    for i, j := 0, m - 1; i < n && j >= 0; {
        num := matrix[i][j]
        if num == target {
            return true
        } else if num < target {
            i++
        } else {
            j--
        }
    }
    return false
}

总结:

勤思考

结语

不管怎么样好好加油。