题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
话不多说,先上代码,解析在下面:
public class Solution {
public boolean Find(int target, int [][] array) {
int row=array.length;
int col=array[0].length;
int left=0;
int right=col-1;
while(left=0){
if(target==array[left][right])
return true;
else if(array[left][right]target)
right--;
}
return false;
}
}
①一开始没仔细审题,以为是要自己录入一个二维数组的值,就是说,通过Scanner录入(一开始傻傻的写了半天),然后再仔细一看题,boolean类型的,而且已经有了参数,target和array这两个题目中的信息……这里是我浪费了n多时间的地方。长个教训……
②二维数组获取行数和列数,一开始写成了.length()……然后才想起来length不用(),直接获取到的,又一次天真。。
③解题思路:因为是二维数组,其实可以从四个角上的数据开始进行思考,比如说你把二维数组看成一个长方体,那么长方体的四个直角所在的四个数据,都可以开始计算。
但是考虑到从小向大【左上角开始】,以及从大到大【右上角开始】,很容易造成一个尴尬的局面,比如下面这个二维矩阵:
1 2 3
2 4 5
3 6 8
1)从左上角开始的话,如果target是5,而你第一次判断的时候,不管是横向,还是纵向,都会发现小于target,那么这个时候到底应该横向++还是纵向++?第三列或者第三行,3还是小于target,这个时候就会跳出while,导致检测不到数据,返回false,然而数组里确实有这个数据,所以不推荐从左上角开始写算法。
2)那么右下角呢?同样是上面这个二维矩阵,如果target=2,就会导致和上面说到的一样的情况。
左上角:既是行最小,又是列最小。
右下角:既是行最大,又是列最大。
正因为如此,左上角和右下角是不可行的。
那么左下角呢?他一定是同列里最大的,同行里最小的,这与右上角有着类似的情况,所以这个是可以的。
④再确认了可以从右上角和左下角开始运算以后,我们就需要定量,比如left和right的值,还有数组元素与target比较后,哪个++,哪个- -,这就是比较简单的问题了。
⑤总结:这个题其实不难,难就难在是否有一颗戒骄戒躁的心,以及认真思考的头脑。