剑指 Offer 04. 二维数组中的查找
由于该二维矩阵的特殊性,可以将其看作一个二叉树,以左下角或者右上角的位置的数为二叉树的根的话有着不同的性质。
- 以左下角为根。
以左下角为根的话,这样的一个二叉树的上节点总是比根小,右节点总是比根大。 - 以右上角为根
以右上角为根的话,这样的一个二叉树的左节点总是比根小,下节点总是比根大。
将二维矩阵转化成二叉树看待,就可以利用其特殊的性质来进行搜索。
算法:
- 有了上述性质之后,算法就很简单了。以左下角为根为例,如果target < root,那么就将根节点移动到上子叶,如果target > root,那么就将根节点移动到右子叶。如果target == root,那么就返回true。
- 当越过二维数组的边界还未搜索到target的话,那么就可以返回false。
代码
- 以左下角为根
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int l = matrix.length, tempL = l-1, tempR = 0;
while(tempL >= 0 && tempR <= matrix[0].length-1){
int root = matrix[tempL][tempR];
if(root < target){
tempR++;
}else if(root > target){
tempL--;
}
else
return true;
}
return false;
}
}
- 以右上角为根
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
int tempL = 0;
if(matrix.length == 0)
return false;
int tempR = matrix[0].length - 1;
while(tempL <= matrix.length-1 && tempR >= 0){
int root = matrix[tempL][tempR];
if(root < target){
tempL++;
}else if(root > target){
tempR--;
}
else
return true;
}
return false;
}
}
注意:
对于二维数组,如果该二位数组为空,例如nums[][] = {}; 在java中,nums.length是可以通过编译的,其结果为零。但是nums[0].length会越界。nums[0].length必须在二维数组不为空的情况下才有值。