题解 | #二维数组中的查找#
二维数组中的查找
http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e
为什么是从左下角、右上角开始,而不是从左上角、右下角开始?
很多题解已经充分说明了,从左下角、右上角是可以的。这里主要讨论一下,从左上角、右下角为啥不行(不是找不出来,而是没有二分的感觉)
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
还是题目的例子,寻找7。
- 从左上角开始,7比1大,就要继续和2比较。一直到8,才知道7不可能在这一行。然后跳到第二行。跟2、4、9比较,发现7也不在这一行。
- 从左下角开始,7比6大,7有可能在这一行,7比8小,7不可能在这一行。跳到上一行。7比4大,7等于7找到。
- 这个例子,可能很难体现出,左上角和左下角的区别。但是仔细想一下,从左下角开始,如果target比那一行的第一个元素小,就可以直接跳过这一行,往上走。而target跟第一行第一个比较之后,没有机会让它跳过一行。
- 从右下角开始。无论是往上比较,还是往左比较,都要比较一整列,或一整行。因为右下角是最大的。
- 从右上角开始,7比9小,所以可以排除最右列,7比8小,所以又可以排除一列。7比2大,往下走,7比4大,7等于7。
不难发现规律,如果要二分,不要从最小值、最大值开始。而是从列最大行最小,或者,行最大列最小开始。
public class Solution {
public boolean Find(int target, int [][] array) {
int row = array.length-1;
int col = 0;
while(row>-1&&col<array[0].length){
if(array[row][col]==target)
return true;
else if(array[row][col]>target){
row--;
col = 0;
}
else col++;
}
return false;
}
}