难度
思路
暴力遍历
从左至右,从上往下挨个遍历即可。
public static boolean findNumberIn2DArray_1(int[][] matrix, int target) {// 做任何题之前都需要判断边界条件if (matrix == null || matrix.length == 0)return false;int columnLength = matrix[0].length;int lineLength = matrix.length;for (int i = 0; i < columnLength; i++) {for (int j = 0; j < lineLength; j++) {if (matrix[j][i] == target) {return true;}}}return false;}
| 时间复杂度 | O(m*n) | | —- | —- | | 空间复杂度 | O(1) |
二叉查找法
从右上角观察,可把矩阵看成一棵二叉树,可用遍历、递归求解。
public static boolean findNumberIn2DArray_3(int[][] matrix, int target) {if (matrix == null || matrix.length == 0 || matrix[0].length < 1) {return false;}// 从右上角遍历int line = matrix.length - 1; // 行值int column = matrix[0].length - 1; // 列值int i = 0, j = column; // 指针// 需要保证两个指针不能越界while (j >= 0 && i <= line) {// 如果目标值大于当前矩阵值,则下移if (matrix[i][j] < target) {i++;} else if (matrix[i][j] == target) {return true;} else {// 如果目标值小于当前矩阵值,则左移j--;}}return false;}
| 时间复杂度 | O(m+n) | | —- | —- | | 空间复杂度 | O(1) |
总结
- 切记不能忘记边界条件判断
- 切记不能忘记初始值条件判断
- 二叉查找思路比较简单清晰,
- 从右上角开始查找,如果
当前值>目标值,则列值--,如果当前值<目标值,则行值++ - 遇到现值相等,就是遇到对的人,直接返回
true即可。
- 从右上角开始查找,如果
- 对于二级数组(matrix),有:
- 行值:
**_i=matrix.length_** - 列值:
**_j=matrix[0].length_** - 左移
i++,下移j++
- 行值:
