LeetCode 搜索二维矩阵

220 阅读2分钟

LeetCode 搜索二维矩阵

搜索二维矩阵是一道比较经典的算法题,其主要考察的是对数组和二分查找的理解与应用。本文将会从以下几个方面,一步步剖析这道题目。

题目描述

给定一个二维矩阵,每一行都按照升序排列,每一列也按照升序排列。现在给出一个目标值,你要写一个函数来判断这个目标值是否在这个矩阵中。

例如,我们有一个二维矩阵如下:

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

我们要查找的目标值为 5。那么,调用我们的函数后应该返回 true,因为矩阵中存在这个数。

解题思路

要解决这道题目,我们需要先了解一个很重要的性质——二维矩阵的某个位置有一个上界和一个下界。对于当前位置 (i,j),可以将其与矩阵的四个角落比较大小,定义上下界的值:

  • 上界:位于 (0,j) 的元素。
  • 下界:位于 (i, n-1) 的元素。

其中,n 是矩阵当前行的长度。

我们可以利用上下界这个性质,来优化搜索。首先,我们考虑从矩阵的右上角出发,依次朝左或者下前进,如果遇到比目标值小的元素,则继续朝下前进;如果遇到比目标值大的元素,则继续朝左前进。如果找到了目标值,就返回 true。如果走出了矩阵,就表示找不到这个目标值,返回 false

特别地,如果当前矩阵为空,返回 false

接下来,我们用代码实现这个思路:

public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            // 如果矩阵为空,返回 false
            return false;
        }
        int n = matrix[0].length;
        int i = 0, j = n - 1;
        while (i < matrix.length && j >= 0) {
            if (matrix[i][j] == target) {
                return true;
            } else if (matrix[i][j] < target) {
                i++;
            } else {
                j--;
            }
        }
        return false;
    }
}

时间复杂度分析

由于我们每次可以排除一行或者一列,因此最多执行 m+nm+n 次查找操作。所以,它的时间复杂度为 O(m+n)O(m+n),其中 mmnn 分别是矩阵的行数和列数。

空间复杂度分析

由于我们只需要用到若干个变量,所以它的空间复杂度为 O(1)O(1)

总结

搜索二维矩阵是一道比较经典的算法题,它主要考察了对二维数组和二分查找的理解和应用。在实际编码过程中,我们可以利用二维数组的性质,优化算法的复杂度,减少不必要的遍历。