- 自己的方法,小白最先想到的循环对比值
/**
* 剑指 Offer 04. 二维数组中的查找
* 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
*
* @author 陈賝
* @version 1.0
* @date 2022/6/29 14:31
*/
public class offer04 {
/**
* TODO
*
* @param matrix 目标矩阵
* @param target 目标值
* @return boolean
* @author 陈賝
* @date 2022/7/5 10:43
*/
public static boolean findNumberIn2DArray(int[][] matrix, int target) {
// 若矩阵为空直接返回false,防止下面越界
if (matrix.length == 0 || matrix[0].length == 0) return false;
// 行边界,列边界
int row = matrix.length - 1, col = matrix[0].length - 1;
// (从右上角出发)当前行指针=0,列指针=右边界
int rowCurrent = 0, colCurrent = col;
/**
* 当前值不等于目标值则循环查找,越界则直接返回false,找到返回true
*/
while (matrix[rowCurrent][colCurrent] != target) {
// 当前值
int value = matrix[rowCurrent][colCurrent];
/**
* 当前值大于目标值则想左走一步
*/
if (value > target && colCurrent > 0) {
colCurrent--;
}
/**
* 当前值大于目标值则向右走一步
*/
else if (value < target && rowCurrent < row) {
rowCurrent++;
}
/**
* 若越界则返回false
*/
else return value == target;
}
return true;
}
/**
* IDE运行
*/
public static void main(String[] args) {
int[][] matrix = new int[][]{
{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}
};
matrix = new int[0][0];
boolean numberIn2DArray = findNumberIn2DArray(matrix, 17);
System.out.println(numberIn2DArray);
}
}
- 不过还是k神的方法好,不用考虑越界问题
public static boolean findNumberIn2DArray2(int[][] matrix, int target) {
// 定义指针从右上角开始走
int i = matrix.length - 1, j = 0;
// 若越界直接返回false
while (i >= 0 && j < matrix[0].length) {
// 若当前值大于目标值 向左走一步
if (matrix[i][j] > target) i--;
// 若当前值小于目标值 向下走一步
else if (matrix[i][j] < target) j++;
// 若相等返回true
else return true;
}
return false;
}