【剑指offer】 面试题4 二维数组中的查找

题目:

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

解题思路

关键是,我们从哪里开始查找? 如果是从头开始查,那么所查之数比数组当前遍历元素大的话,我们怎么办?按照本题数组中的递增规律,应该是向下或者向右进行搜索,但是这样的话就加大了搜索的难度。

最理想的办法是,通过每次查找操作,都能对所搜索的范围进行缩小,直到找到目标(其实这个缩小搜索范围的思想很像二分查找)。

有了这样的需求,我们可以观察二维数组组成的一个矩阵,如果从矩阵的右上角进行查找,那么所查之数比数组当前遍历元素大的话,我们就可以进行下移并且将不再考虑当前元素所在行的左边(因为当前元素为所在行最大的),依次类推,如果当前元素比所查元素大就删去所在列,反之删去所在行,这样逐步缩小搜索范围,只到查到结果。同理,从左下角开始也可以。

主要代码c++

bool Find(int *matrix, int rows, int columns, int number)
{
    bool found = false;

    if(matrix != nullptr && rows >0 && columns >0)
    {
        int row = 0;
        int column = columns - 1 // 保证从右上角开始搜素
        while(row<rows && column>=0)
        {
            //元素在矩阵中的位置表达式 row*columns + column
            // 这是关键!根据大小关系进行元素位置的移动
            if(matrix[row*columns + column] == number) 
                {
                    found = true;
                    break;
                    }
            else if(matrix[row*columns + column] > number)
                --column;
            else
                ++row;
    }

    return found;
}
}

猜你喜欢

转载自blog.csdn.net/qq_37466121/article/details/85091010