创见博客
搜索二维矩阵II
七崽爱吃小饼干2026/01/27阅读 0专栏 算法合集

搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。 每列的元素从上到下升序排列。

示例 1:

codeType
输入: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:

codeType
输入: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

解法

解法一 直接逐个搜索
解法二 逐行二分搜索
ts
function searchMatrix(matrix: number[][], target: number): boolean {
    // 这题没法直接从二维数组映射成一维升序数组,所以没法直接用二分查找
    // 但是每行或者每列都是升序的
    // 可以逐行进行二分查找
    const n = matrix.length
    const m = matrix[0].length
    for(let i = 0; i < n; i++){
        let low = 0, high = m - 1
        while(low <= high){
            const mid = Math.floor((low + high) / 2)
            if(matrix[i][mid] === target){
                return true
            }else if(matrix[i][mid] < target){
                // 在右边
                low = mid + 1
            }else{
                // 在左边
                high = mid - 1
            }
        }
    }
    return false
};
解法三:z字搜索
ts
function searchMatrix(matrix: number[][], target: number): boolean {
    // z字搜索
    const m = matrix.length, n = matrix[0].length;
    let x = 0, y = n - 1;
    while (x < m && y >= 0) {
        if (matrix[x][y] === target) {
            return true;
        }
        if (matrix[x][y] > target) {
            --y;
        } else {
            ++x;
        }
    }
    return false;
};
评论
0/100