Leetcode JAVA刷刷站(74)搜索二维矩阵
一、题目概述

二、思路方向
要在一个满足上述条件的矩阵中查找一个整数
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是矩阵的列数。这样我们就可以在二维矩阵上应用二分查找算法了。
结语
你不甘平凡的勇气
是改写命运的笔
!!!

