《剑指offer》面试题04:二维数组中的查找

更多剑指offer面试习题请点击: 《剑指offer》(第二版)题集目录索引

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


解题思路:杨氏矩阵的特点是它的行和列的数都是递增的,所以我们可以选择它的一个顶点元素作为比较对象。比如我在下面这个数组中查找数字2。
①把a[0][3]处的元素4和2比较,2<4,所以2肯定不在第3列(因为4是第三列最小的元素,下面的元素都比4大,自然都比2大),我们就把第三列排除。
②把a[0][2]处的元素3和2比较,2<3,所以2也肯定不在第2列,我们就再把第2列排除。
③把a[0][1]处的元素2和2比较,2==2,2找到了,查找结束。
《剑指offer》面试题04:二维数组中的查找_第1张图片
②把a[0][2]处的元素3和2比较,2<3,所以2也肯定不在第2列,我们就再把第2列排除。
《剑指offer》面试题04:二维数组中的查找_第2张图片

③把a[0][1]处的元素2和2比较,2==2,2找到了,查找结束。
《剑指offer》面试题04:二维数组中的查找_第3张图片

如果查找的数是6,6>4,那么就把第0行排除(因为4是第0行最大的元素,6都比这行最大的元素大,那其他元素肯定是小于6的),然后开始从a[1][3]比较 ,以此类推,找不到就排除这一行,直到找到或者找不到为止。

int Find(int* matrix, int rows, int columns, int number)
{
    assert(matrix != NULL);

    int ret = 0;
    if (rows > 0 && columns > 0)//数组不能为空
    {
        int row = 0;
        int column = columns - 1;
        while (row < rows && column >= 0)
        {
            if (matrix[row * columns + column] == number)//先比较坐标为(0,2)的元素,相等则把ret置为1
            {
                ret = 1;
                break;
            }
            else if (matrix[row * columns + column] > number)
                --column;//如果大于要查找的数,排除这列
            else
                ++row;如果小于要查找的数,排除这一行
        }
    }

    return ret;
}

int main()
{
    int matrix[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
    int number = 5;
    int result = Find(matrix, 3, 3, number);
    if (1 == result)
        printf("got it\n");
    else
        printf("Don't get it\n");

    system("pause");
    return 0;
}

查找5,查找成功
《剑指offer》面试题04:二维数组中的查找_第4张图片
.
.
.
查找10,查找失败
《剑指offer》面试题04:二维数组中的查找_第5张图片

你可能感兴趣的:(剑指offer面试题)