当前位置: 面试刷题>> 搜索二维矩阵(经典算法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; } ``` 在准备面试时,理解这类题目的解题思路非常重要,这不仅能展示你的算法思维,还能体现你解决问题的能力。希望这些示例代码对你有所帮助,在码小课网站上,你也可以找到更多类似的算法题目和解析。