📅  最后修改于: 2023-12-03 15:10:12.019000             🧑  作者: Mango
本文介绍如何在行列排序的矩阵中进行搜索。我们将使用Java来实现算法。
给定一个 m
行 n
列的矩阵,矩阵中的元素已按行列非降序排列。请编写一个程序,在矩阵中查找目标值。返回该目标值所在的位置,如果不存在则返回 -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}
。
接下来,我们从矩阵的右上角开始搜索,使用两个指针 i
和 j
分别指向当前搜索位置的行和列。由于矩阵按照行列非降序排列,因此每次比较当前指针位置的元素与目标元素的大小关系:
如果当前元素等于目标元素,则说明已经找到了目标元素,返回当前位置的行列坐标。
如果当前元素大于目标元素,则说明目标元素应在当前元素的左边,将列指针 j
减1。
如果当前元素小于目标元素,则说明目标元素应在当前元素的下面,将行指针 i
加1。
通过上述过程,直到找到目标元素或者搜索完整个矩阵仍未找到,则返回{-1, -1}
。
本文介绍了如何在行列排序的矩阵中进行搜索,并使用Java代码实现了搜索算法。将列指针和行指针从右上角或左下角开始搜索,通过不断缩小搜索范围的方式,最终找到目标元素或搜索完整个矩阵,实现了高效的搜索算法。
参考文献:
LeetCode. Search a 2D Matrix II. https://leetcode.com/problems/search-a-2d-matrix-ii/