📜  搜索 2D 矩阵 II - Java (1)

📅  最后修改于: 2023-12-03 15:10:11.777000             🧑  作者: Mango

搜索 2D 矩阵 II - Java

如果你面试过大型科技公司,那么你肯定会遇到类似的问题:“如何在一个二维矩阵中查找目标元素?”在本篇文章中,我们将讨论如何使用 Java 语言解决这个问题。

问题描述

给定一个二维矩阵 matrix,其中每行和每列均按升序排序,请编写一个函数来查找目标元素 target。如果目标元素存在于矩阵中,则返回 true,否则返回 false。

示例 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
解决方案
算法分析

在上述示例中,我们可以观察到一个有趣的现象,即对于每个元素,其左侧和上方的元素均小于它,而右侧和下方的元素均大于它。这种特点为我们解决问题提供了极大的便利。

因此,我们可以使用一种逐步排除的策略来解决这个问题。具体地说,我们从矩阵的左下角开始搜索。如果当前元素比目标元素小,则它上方的元素肯定也小于目标元素,因此我们可以将搜索范围缩小到该元素的右方;如果当前元素比目标元素大,则它右侧的元素肯定也大于目标元素,因此我们可以将搜索范围缩小到该元素的上方。通过这种不断缩小搜索范围的方式,我们最终可以找到目标元素。

代码实现
public boolean searchMatrix(int[][] matrix, int target) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
        return false;
    }
    int m = matrix.length;
    int n = matrix[0].length;
    int i = m - 1;
    int j = 0;
    while (i >= 0 && j < n) {
        if (matrix[i][j] == target) {
            return true;
        } else if (matrix[i][j] < target) {
            j++;
        } else {
            i--;
        }
    }
    return false;
}
复杂度分析

该算法的时间复杂度为 $O(m+n)$。在最坏情况下,我们需要遍历矩阵的左下角,直到搜索到矩阵的右上角。

其空间复杂度为 $O(1)$,因为我们只需要几个辅助变量来存储搜索过程中的状态。

总结

通过本篇文章,你已经了解了如何使用 Java 语言解决二维矩阵查找问题,并且对于题目描述和算法分析有了更深入的理解。这是一个非常经典的算法问题,掌握它可以为你的面试和工作带来重要帮助。