题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
两种方法:
第一种比较普遍的遍历所有,那我们首先就需要确定从数组的哪个地方开始查找.比较好的位置就是从四个角开始搜索.
个人选了从右上角开始,没啥原因,就是想而已,其他地方也可以,只不过是代码的数字改变而已.
public static boolean find1(int[][] array ,int target){
//判断特殊情况
if (array == null || array.length == 0){
return false;
}
int row = 0 ;
int column = array[0].length - 1 ;
while (row < array.length && column >= 0){
if (array[row][column] == target){
return true ;
}
//比查找的数大,往前查找
if (array[row][column] > target){
column-- ;
} else {
//数组为递增,右上角是第一行最大的数
//如果比查找的数小,则需要到下一行寻找
row++;
}
}
return false ;
}
第二种方法则是二分法:
[1]二分法查找适用于数据量较大时,但是数据需要先排好顺序(题目中说为递增函数,满足)
[2]确定该区间的中间位置K
[3]将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域
[4]继续二分
private static Boolean find2(int[][] array, int target) {
//判断特殊情况
if (array == null || array.length == 0) {
return false;
}
//确定数组中间数
int left = 0;
int right = array.length * array[0].length - 1;
int col = array[0].length;
while (left <= right) {
int mid = (left + right) / 2;
//确定数组中间值
int value = array[mid / col][mid % col];
if (value == target) {
return true;
} else if (value < target) {
//此时中间值小于查找数,往下一块区域查询
left = mid + 1;
} else {
//往左边区域查找
right = mid - 1;
}
}
return false;
}
关于数组中间值确定的方法有很多种,我也是查询了一些大佬们的方法,选了一种能记得下来的方式,至于原理还要再理解一下.不过这个相当于公式,先套用了再说.