题目描述
给定一个二维矩阵 matrix
,其每一行已按升序排列,每一列也已按升序排列。请编写一个函数来搜索矩阵中的一个目标值 target
。如果目标值存在于矩阵中,则返回其true
;否则返回false
。
示例 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
解题思路
由于矩阵的每一行和每一列都已排序,我们可以从矩阵的右上角或左下角开始搜索。这里以从右上角开始搜索为例:
- 初始化指针
row
指向矩阵的第一行,col
指向矩阵的最后一列。 - 如果当前元素
matrix[row][col]
等于目标值target
,则返回true
。 - 如果当前元素大于目标值,说明目标值只可能在当前元素的左边(因为行内已排序且从右向左搜索),所以
col--
。 - 如果当前元素小于目标值,说明目标值只可能在当前元素的下方(因为列内已排序且从上向下搜索),所以
row++
。 - 如果
row
超出矩阵行数或col
超出矩阵列数,说明已经搜索完整个矩阵,返回false
。
PHP 代码示例
function searchMatrix($matrix, $target) {
if (empty($matrix) || empty($matrix[0])) {
return false;
}
$row = 0;
$col = count($matrix[0]) - 1;
while ($row < count($matrix) && $col >= 0) {
if ($matrix[$row][$col] == $target) {
return true;
} elseif ($matrix[$row][$col] > $target) {
$col--;
} else {
$row++;
}
}
return false;
}
Python 代码示例
def searchMatrix(matrix, target):
if not matrix or not matrix[0]:
return False
row, col = 0, len(matrix[0]) - 1
while row < len(matrix) and col >= 0:
if matrix[row][col] == target:
return True
elif matrix[row][col] > target:
col -= 1
else:
row += 1
return False
JavaScript 代码示例
function searchMatrix(matrix, target) {
if (!matrix.length || !matrix[0].length) {
return false;
}
let row = 0;
let col = matrix[0].length - 1;
while (row < matrix.length && col >= 0) {
if (matrix[row][col] === target) {
return true;
} else if (matrix[row][col] > target) {
col--;
} else {
row++;
}
}
return false;
}
在准备面试时,理解这类题目的解题思路非常重要,这不仅能展示你的算法思维,还能体现你解决问题的能力。希望这些示例代码对你有所帮助,在码小课网站上,你也可以找到更多类似的算法题目和解析。