leetcode-搜索二维矩阵

75 阅读1分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。

  • 示例 1:

1.png

输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true
  • 示例 2:

2.png

输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出: false
  • 提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

实现思路

解法一:由题可知,矩阵中每行的最后一个是最大的并且比上一行大,这样我们就可以通过遍历每行的最后一个锁定target在哪一行,再通过遍历当行看是否含有target

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    let m = matrix.length
    let n = matrix[0].length
    let index = 0
    for (let i = 0; i < m; i++) {
        if (matrix[i][n - 1] >= target) {
            index = i
            break
        }
    }
    for (let i = 0; i < n; i++) {
        if (matrix[index][i] == target) {
            return true
        }
    }
    return false
};

解法二:我们可以将二维矩阵看成一个坐标系,行为x轴列为y轴matrix[x][y],原点放在二维矩阵的左下角matrix[m-1][0],当matrix[x][y] > target时说明matrix[x][y]太大了往上移动x--,matrix[x][y] < target说明matrix[x][y]太小了往右移动y++,当matrix[x][y] = target说明找到了返回true,如果x和y超出了二维矩阵的范围说明target不在二维矩阵中返回false

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    let m = matrix.length
    let n = matrix[0].length
    let x = m - 1, y = 0
    let bool = true
    while (bool) {
        if (matrix[x][y] > target) {
            x--
        } else if (matrix[x][y] < target) {
            y++
        } else {
            return true
        }
        if (x < 0 || x >= m || y < 0 || y >= n) {
            bool = false
        }
    }
    return false
};