题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题目分析
分析1
- 看到这个题目,我们首先的反应是折半查找,因为这是一个有序数组,那么可以在每一个分量上面进行折半查找,那么这样的时间复杂度为O(nlogn).
分析2
- 在上面的分析上面,显然我们只使用了y方向或者x方向的顺序性,而未使用另一个方向的顺序性,那么,我们该如何使用另一个方向的顺序性呢?下面进行分析。
-
- 1 2 8 9
-
- 2 4 9 12
-
- 4 7 10 13
-
- 6 8 11 15
- 比如说我们要查找数字7,观察上述矩阵。我们确定查找起点与查找方向
- 我们使用右上角为起点,方向如下规定:
- 如果 当前数字等于目标值,那么返回true
- 如果 当前数字大于目标值,那么当前数字所在列以下数字全部大于目标值,那么继续向左查找
- 如果 当前数字小于目标值,目标值可能出现在这一列,那么向下查找
- 如果超出边界,返回flase
java代码
public boolean Find(int target, int [][] array) {
boolean flag = false;
int loc_x = 0;
int loc_y = array[0].length-1;
// 二维数组查找时
// 起点,右上角
// loop:方向先向左,再向下
while(loc_x < array.length && loc_y>=0){
if(array[loc_x][loc_y] == target){
flag = true;
break;
}else if(array[loc_x][loc_y] > target){
loc_y--;
}else {
loc_x++;
}
}
return flag;
}