📜  搜索行列排序矩阵 leetcode - Java (1)

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

搜索行列排序矩阵

本文介绍如何在行列排序的矩阵中进行搜索。我们将使用Java来实现算法。

题目描述

给定一个 mn 列的矩阵,矩阵中的元素已按行列非降序排列。请编写一个程序,在矩阵中查找目标值。返回该目标值所在的位置,如果不存在则返回 -1,-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 输出: [1,1]

解题思路

由于矩阵按照行列非降序排列,我们可以从矩阵的右上角或左下角出发进行搜索。比如从右上角开始搜索,如果目标值小于当前元素,则说明目标元素应该在当前元素的左边,因为左边的元素都比它小,如果目标值大于当前元素,则说明目标元素应当在当前元素的下面,因为下面的元素都比它大。

我们可以通过不断缩小搜索范围的方式来找到目标元素。如果最终没有找到,则说明目标元素不存在于矩阵中。

代码实现

下面是Java代码实现:

class Solution {
    public int[] searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        if(m == 0) return new int[]{-1, -1};
        int n = matrix[0].length;
        if(n == 0) return new int[]{-1, -1};
        int i = 0, j = n - 1;
        while(i < m && j >= 0) {
            if(matrix[i][j] == target) {
                return new int[]{i, j};
            } else if(matrix[i][j] > target) {
                j--;
            } else {
                i++;
            }
        }
        return new int[]{-1, -1};
    }
}

以上代码中,我们定义了一个名为 Solution 的类,其中 searchMatrix 方法用来实现搜索矩阵的功能。该方法接受两个参数:一个二维矩阵 matrix 和目标值 target

首先,我们获取矩阵的行列数。如果行数或列数为0,则说明矩阵是空的,返回{-1, -1}

接下来,我们从矩阵的右上角开始搜索,使用两个指针 ij 分别指向当前搜索位置的行和列。由于矩阵按照行列非降序排列,因此每次比较当前指针位置的元素与目标元素的大小关系:

如果当前元素等于目标元素,则说明已经找到了目标元素,返回当前位置的行列坐标。

如果当前元素大于目标元素,则说明目标元素应在当前元素的左边,将列指针 j 减1。

如果当前元素小于目标元素,则说明目标元素应在当前元素的下面,将行指针 i 加1。

通过上述过程,直到找到目标元素或者搜索完整个矩阵仍未找到,则返回{-1, -1}

总结

本文介绍了如何在行列排序的矩阵中进行搜索,并使用Java代码实现了搜索算法。将列指针和行指针从右上角或左下角开始搜索,通过不断缩小搜索范围的方式,最终找到目标元素或搜索完整个矩阵,实现了高效的搜索算法。

参考文献:

LeetCode. Search a 2D Matrix II. https://leetcode.com/problems/search-a-2d-matrix-ii/