题目:
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 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,返回 true。 给定 target = 20,返回 false。 限制: 0 <= n <= 1000 0 <= m <= 1000 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { } }方法一:暴力查找
依次遍历二维数组的每一行和每一列。如果找到一个元素等于目标值,则返回 true。如果遍历完毕仍未找到等于目标值的元素,则返回 false。
public static boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0) return false; int rowLength = matrix.length, colLength = matrix[0].length; for (int i = 0;i < rowLength;i++){ for (int j = 0;j < colLength;j++){ if (matrix[i][j] == target) return true; } } return false; }复杂度分析: 时间复杂度:O(nm)。最坏情况下二维数组中的每个元素都被遍历, 因此时间复杂度为二维数组的大小。
空间复杂度:O(1)。
方法二:线性查找
由于给定的二维数组具备每行从左到右递增以及每列从上到下递增的特点,当访问到一个元素时,可以排除数组中的部分元素。
从二维数组的右上角开始查找(也可从左下角遍历最后一行开始)。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。
可以证明这种方法不会错过目标值。如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。
public static boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix ==null || matrix.length <= 0 || matrix[0].length <= 0) return false; int rowLength = matrix.length, colLength = matrix[0].length; int row = 0, col = colLength - 1; while(row < rowLength && col >= 0){ int number = matrix[row][col]; if ( number> target){ col--; }else if (number < target){ row++; }else{ return true; } } return false; }复杂度分析 时间复杂度:O(n+m)。访问到的下标的行最多增加 n 次,列最多减少 m 次, 因此循环体最多执行 n + m 次。 空间复杂度:O(1)。
方法三:自己写的(常人的思想吧,参考而已)
public static boolean findNumberIn2DArray(int[][] matrix, int target) { if (matrix ==null || matrix.length <= 0 || matrix[0].length <= 0) return false; int num = 0; for (int i = 0;i < matrix.length && i < matrix[0].length; i++){ if (matrix[i][i] == target) return true; if (matrix[i][i] > target){ num = i - 1 > 0 ? i - 1 : 0; break; } } for (int i = num;i < matrix.length; i++){ for (int j = 0;j < matrix[0].length; j++){ if (matrix[i][j] == target) return true; } } for (int i = 0;i <= num; i++){ for (int j = num;j < matrix[0].length; j++){ if (matrix[i][j] == target) return true; } } return false; }