在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
/**
* 二维数组有序
* 1.首先判断target是否在一维数组的范围内,即target < array[][xLen-1] 且 target > array[][0]
* 2.如果target小于一维数组的第一个数,则可以直接返回false
* 3.因为数组一维二维皆有序,采用二分查找减小时间复杂度
* @param target
* @param array
* @return
*/
public boolean Find(int target, int[][] array) {
int xLen = array[0].length, yLen = array.length;
//增加xLen > 0 是为了判断空数组时防止出现数组越界异常
for (int i = 0; i < yLen && xLen > 0; i++) {
if (target >= array[i][0] && target <= array[i][xLen-1]) {
boolean flag = twoFind(target, array[i], 0, xLen - 1);
if(flag == true)
return flag;
else
continue;
}else if (target < array[i][0]){
break;
}
}
return false;
}
public static boolean twoFind(int target, int[] array, int start, int end) {
int mid = (end + start) / 2;
if (target == array[mid])
return true;
if (end <= start && array[start] != target)
return false;
if (target > array[mid])
return twoFind(target, array, mid + 1, end);
if (target < array[mid])
return twoFind(target, array, start, mid - 1);
return false;
}