[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]
从右上角看就是一个二叉搜索树。
第二个代码来源:
@mata川
https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/comments/
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0){
return false;
}
if(matrix[0][0] > target || matrix[matrix.length - 1][matrix[matrix.length-1].length - 1] < target){
return false;
}
int xLen = matrix.length;//行数
int yLen = matrix[0].length;//列数
boolean flagX = false;
for(int i = 0;i < matrix.length;i++){
if(target >= matrix[i][0] && target <= matrix[i][yLen - 1]){
flagX = searchX(target,matrix,i);
if (flagX){
return true;
}
}
}
boolean flagY = false;
for (int i = 0; i < matrix[0].length; i++) {
if (target >= matrix[0][i] && target <= matrix[xLen - 1][i]){
flagY = searchY(target, matrix, i);
if (flagY){
return true;
}
}
}
return false;
}
private boolean searchX(int target, int[][] matrix,int x) {
for (int i = 0; i < matrix[x].length; i++) {
if (matrix[x][i] == target){
return true;
}
}
return false;
}
private boolean searchY(int target, int[][] matrix,int y) {
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][y] == target){
return true;
}
}
return false;
}
//二叉树查找
public boolean findNumberIn2DArray1(int[][] matrix, int target) {
if(matrix == null || matrix.length == 0 ||matrix[0].length == 0){
return false;
}
if(matrix[0][0] > target || matrix[matrix.length - 1][matrix[matrix.length-1].length - 1] < target){
return false;
}
int m = matrix.length;
int n = matrix[0].length;
int x = 0;
int y = matrix[0].length - 1;
while (x < m && y >= 0){
if (target > matrix[x][y]){
x++;
} else if (target < matrix[x][y]){
y--;
} else {
return true;
}
}
return false;
}