【路飞】算法与数据结构-搜索二维矩阵 II

135 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

编写一个高效的算法来搜索 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

思路

  • 矩阵已经排好序了
  • 左下角的位置特殊:上面的比它小,右边的比它大
  • 选取左下角的位置开始遍历,如果当前数大了,上移一行;当前数小了,右移一列
  • 找到返回true,遍历完返回false
const searchMatrix = (matrix, target) => {
    // 矩阵的行、列
    const [m, n] = [matrix.length, matrix[0].length];
    // (i,j)初始位置在左下角
    let [i, j] = [m - 1, 0];
    while (i >= 0 && j < n) {
        const item = matrix[i][j];
        if (item > target) {
            // 太大了,上移一行
            i--;
        } else if (item < target) {
            // 太小了,右移一列
            j++;
        } else {
            // 找到,返回true
            return true;
        }
    }
    // 遍历完没找到,返回false
    return false;
};