一、题目概述
二、思路方向
要在一个满足上述条件的矩阵中查找一个整数
target
,我们可以利用矩阵的排序和递增特性来优化搜索过程。由于矩阵的每一行都是非严格递增的,且后一行的第一个元素大于前一行的最后一个元素,我们可以将矩阵视为一个有序的一维数组,并采用二分查找的方法来加速搜索过程。
三、代码实现
public class Solution {
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 left = 0;
int right = m * n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
int midVal = getElement(matrix, mid / n, mid % n);
if (midVal == target) {
return true;
} else if (midVal < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
// 辅助函数,根据二维数组的索引(转换为一维数组的索引)来获取元素值
// row 和 col 分别是二维数组的行和列索引
private int getElement(int[][] matrix, int row, int col) {
return matrix[row][col];
}
public static void main(String[] args) {
Solution solution = new Solution();
int[][] matrix = {
{1, 3, 5, 7},
{10, 11, 16, 20},
{23, 30, 34, 50}
};
int target = 3;
System.out.println(solution.searchMatrix(matrix, target)); // 输出 true
target = 20;
System.out.println(solution.searchMatrix(matrix, target)); // 输出 true
target = 22;
System.out.println(solution.searchMatrix(matrix, target)); // 输出 false
}
}
执行结果:
四、小结
这段代码首先检查矩阵是否为空或大小为0,然后初始化二分查找的左右边界(即将二维矩阵转换为一维数组时的索引范围)。在循环中,通过计算
mid
的行和列索引来获取中间元素的值,并与target
进行比较。根据比较结果更新查找的边界,直到找到target
或搜索范围为空。注意,这里通过
mid / n
和mid % n
将一维索引转换为二维索引,其中n
是矩阵的列数。这样我们就可以在二维矩阵上应用二分查找算法了。
结语
你不甘平凡的勇气
是改写命运的笔
!!!