题目描述
编写一个高效的算法来搜索 m x n
矩阵 matrix
中的一个目标值 target
。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例 1:
输入: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出: true
示例 2:
输入: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出: false
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= n, m <= 300
- -109<= matrix[i][j] <= 109
- 每行的所有元素从左到右升序排列
- 每列的所有元素从上到下升序排列
- -109 <= target <= 109
代码及注释
func searchMatrix(matrix [][]int, target int) bool {// 初始化指针,right指向每行的最后一个元素,top指向第一行right := len(matrix[0]) - 1top := 0// 循环,直到top超出矩阵的行数或者right小于0for top < len(matrix) && right >= 0 {// 如果找到目标值,返回trueif matrix[top][right] == target {return true} // 如果当前元素小于目标值,说明目标值可能在当前行的后面部分,top指针下移else if matrix[top][right] < target {top++} // 如果当前元素大于目标值,说明目标值可能在当前列的前面部分,right指针左移else {right--}}// 循环结束后还未找到目标值,返回falsereturn false
}
代码解释
矩阵有以下特点:
- 矩阵中的每一行都是按照从左到右递增的顺序排序。
- 矩阵中的每一列都是按照从上到下递增的顺序排序。
因此,我们可以利用这两个特性进行高效的查找。
-
初始化指针:
right
指向每行的最后一个元素。top
指向第一行。
-
循环查找:
- 当
top
小于矩阵的行数并且right
大于等于0时,执行循环。 - 如果找到目标值,返回
true
。 - 如果当前元素小于目标值,说明目标值可能在当前行的后面部分,所以
top
指针下移。 - 如果当前元素大于目标值,说明目标值可能在当前列的前面部分,所以
right
指针左移。
- 当
-
返回结果:
- 如果循环结束还未找到目标值,返回
false
。
- 如果循环结束还未找到目标值,返回
这个算法的时间复杂度是O(m + n),其中m是矩阵的行数,n是矩阵的列数。这是一个非常高效的方法,因为它在每次迭代中都排除了一行或一列,直到找到目标值或者遍历完整个矩阵。