当前位置: 面试刷题>> 搜索二维矩阵(经典算法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 代码示例

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;
}

在准备面试时,理解这类题目的解题思路非常重要,这不仅能展示你的算法思维,还能体现你解决问题的能力。希望这些示例代码对你有所帮助,在码小课网站上,你也可以找到更多类似的算法题目和解析。

推荐面试题