LeetCode 数据结构基础 - 搜索二维矩阵 II

99 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

搜索二维矩阵 II

原题地址

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

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

示例 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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • 109-10^9 <= matrix[i][j] <= 10910^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • 109-10^9 <= target <= 10910^9

思路分析

  1. 看到题目的第一时间想到的最粗暴的解法就是使用数组的 some 方法, matrix.some(item => item.includes(target)),果不其然,这种方法会超时。
  2. 题目中给出的数组 每行从左到右升序,每列从上到下升序,那么我们可以知道数组肯定是左上角的最小,右下角的最大。
  3. 使用 row < matrix.length && col >= 0 作为条件循环,若target 大于当前元素,则需要 row 向下移动,即 row++;若 target 小于当前元素,则需要 col 向左移动,即 col--。若相等则返回 true。循环完成后没有找到相等的,则返回 false

AC 代码

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

结果:

  • 执行结果: 通过
  • 执行用时:344 ms, 在所有 JavaScript 提交中击败了68.44%的用户
  • 内存消耗:43.5 MB, 在所有 JavaScript 提交中击败了63.19%的用户
  • 通过测试用例:129 / 129

END