题解 | #二维数组中的查找#

二维数组中的查找

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;
    }
}
全部评论

相关推荐

2025-12-09 16:37
西北大学 前端工程师
点赞 评论 收藏
分享
2025-12-20 13:19
已编辑
曲阜师范大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务