数据结构和算法

数组 - LeetCode 04.二维数组中的查找

2023-10-26  本文已影响0人  我阿郑

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数target,判断该数是否在该二维数组中。

[
  [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]
]

Given target = 5, return true.
Given target = 20, return false.

思考:

将矩阵逆时针旋转 45° 发现其类似于二叉搜索树:

image.png

“根节点” 对应矩阵 “左下角” 或 “右上角” 元素,称之为 标志数。若以矩阵左下角元素为标志数flag :

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        int i = matrix.length - 1, j = 0;
        while(i >= 0 && j < matrix[0].length)
        {
            if(matrix[i][j] > target) i--;
            else if(matrix[i][j] < target) j++;
            else return true;
        }
        return false;
    }
}

算法流程:

  1. 从矩阵左下角元素(索引设为 (i, j) )开始遍历,并与target对比:
  1. 若行索引或列索引越界,则代表矩阵中无目标值,返回 false

每轮 i--j-- 后,相当于生成了“消去一行(列)的新矩阵”, 索引(i,j) 指向新矩阵的左下角元素(标志数),因此可重复使用以上性质消去行(列)。

image.png

复杂度分析:

上一篇下一篇

猜你喜欢

热点阅读