当前位置: 面试刷题>> 搜索二维矩阵(经典算法150题)
### 题目描述
给定一个二维矩阵 `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
```
### 解题思路
由于矩阵的每一行和每一列都已排序,我们可以从矩阵的右上角或左下角开始搜索。这里以从右上角开始搜索为例:
1. 初始化指针 `row` 指向矩阵的第一行,`col` 指向矩阵的最后一列。
2. 如果当前元素 `matrix[row][col]` 等于目标值 `target`,则返回 `true`。
3. 如果当前元素大于目标值,说明目标值只可能在当前元素的左边(因为行内已排序且从右向左搜索),所以 `col--`。
4. 如果当前元素小于目标值,说明目标值只可能在当前元素的下方(因为列内已排序且从上向下搜索),所以 `row++`。
5. 如果 `row` 超出矩阵行数或 `col` 超出矩阵列数,说明已经搜索完整个矩阵,返回 `false`。
### PHP 代码示例
```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 代码示例
```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 代码示例
```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;
}
```
在准备面试时,理解这类题目的解题思路非常重要,这不仅能展示你的算法思维,还能体现你解决问题的能力。希望这些示例代码对你有所帮助,在码小课网站上,你也可以找到更多类似的算法题目和解析。