题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
好了,看完题目,我们再看看例子:
数组arr满足题目要求:
1 2 3 5
5 6 7 8
9 10 11 12
笔者看到这种题,不觉摸了摸发际线下的额头,心想:讲道理,这题也太简单了吧?
于是,笔者内心是波澜的:
波澜一,使用蛮力法,无脑遍历该二维数组,逐一对比,将待查找的数与数组项比较,相等就返回true,不等继续。
好吧,笔者承认是为了省事儿,选择了该方法.....
but ......
好奇心作祟,google了一波,发现......神仙都不会直接遍历数组。
好吧,确实有更好的办法。
毕竟让笔者承认自己不足,需要很大的勇气。
花费许久,才看懂神仙的思维,心湖掠起一阵波涛。
波涛二,从二维数组右上角观察数组arr:
1 2 3 5 |||
5 6 7 8 |||
9 10 11 12 |||
假设我们查找数字6,从右上角5开始。
明显,6 > 5。而数字6可定大于数字5所在的行,所以,去掉数字5所在的行,即:
5 6 7 8 |||
9 10 11 12 |||
继续从右上角数字8开始。
明显 6 < 8 。所以,数字6肯定小于8所在的列,所以去掉数字8所在的列,即:
5 6 7 |||
9 10 11 |||
依次类推:......最终会变成这样。所以,数字6存在该二维数组中。
5 6 |||
9 10 |||
public static boolean findNumber(int[][] arr, int num){
//参数检查
if(arr == null) return false;
//查找标志
boolean success = false;
//右上角数值的行
int tempRow = 0;
//右上角数值的列
int tempColumn = arr[0].length - 1;
while(tempRow > 0 && tempColumn >= 0){
if(arr[tempRow][tempColumn] == num){
success = true;
break;
}else if(arr[tempRow][tempColumn] < num){
tempRow++;
}else if(arr[tempRow][tempColumn] > num){
tempColumn--;
}else{
return false;
}
}
return success;
}