《剑指Offer》面试题四(牛客网在线编程第一题):二维数组中的查找(Java实现)

        题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

        例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组中不含有该数字,则返回false。

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

        思路:由于要在牛客网上在线提交测试,便不考虑暴力遍历解法(代码行极少,却很费时)。

        采用《剑指Offer》书中的思路:首先选取数组右上角(或者是左下角,同理)的数字,如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则剔除这个数字所在的列,向左搜寻(缩小范围);如果该数字小于要查找的数字,则剔除这个数字所在的行,向下搜寻。

        参考书中C++的实现代码,对应Java实现代码如下所示,牛客网在线提交通过(ps:在牛客网上泡的时间也不短了,第一次在线提交编程题,汗-_-||)。

public class Solution {
    public boolean Find(int target, int [][] array) {   
        int rows = array.length;   //二维数组的行长度
        int cols = array[0].length;    //二维数组的列长度
        if(array != null && rows > 0 && cols > 0) { 
            int row = 0;
            int col = cols - 1;
            while(row < rows && col >= 0) {  
                int temp = array[row][col];
                if (temp > target) {  
                    col--;    //待查找的数小于“角值”时,则行不变列-1向左搜寻
                }
                else if (temp < target) {
                    row++;    //待查找的数大于“角值”时,则列不变行+1向下搜寻
                }
                else {
                    return true;
                }
            }
        }
        return false;
    }
}

        PS:第一次写博客还是有点小激动,之前遇到技术问题,总是喜欢找各路大神博客,心中各种崇拜,但是问题解决以后却从没有总结心得体会,经验教训。面临找工作,才发现技术博客的重要性,以后将刷到的题目(虽然都很简单,原谅小白的猥琐发育把)都写成博客记录下来,也算是个人的一片独立王国吧。

猜你喜欢

转载自blog.csdn.net/xielingxuan666/article/details/81476235