• 剑指offer--面试题3


       一 题目:

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

       二 分析

    1. 如果这个二维数组是未排序的数组,那么只能通过遍历整个数组判断是否存在输入的整数;
    2. 如果每一行都是升序排列,那可以通过比较每一行末尾的数,首先确定需要查询的数可能出现在哪一行,然后再在那一行上做二分查找,同样的道理适合列排序;
    3. 如果行和列都按升序排序,可以仿照分析2中的方法,首先选取右上角的数作比较,若小于该数就向左比较,若大于该数就向下比较;

    比如,要在如下的数组中查找7,按照分析3的方法,查找步骤如下:

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

    9大于7,下一次只需要在9的左边区域查找;

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

    8大于7,下一次只需要在9的左边区域查找; 

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

    2小于7,下一次只需要在2的下边区域查找; 

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

    4小于7,下一次只需要在2的下边区域查找;

    经过5次比较后,查找到7存在。

    三 实现

    bool Find(int* matrix,int rows,int columns,int number)
    {
        bool found = false;
        if(matrix != NULL && rows > 0 && columns > 0)
        {
            int row=0;
            int column = columns - 1;
            while(row < rows && column >=0)
            {
                if(matrix[row][column] == number)
                {
                    found = true;
                    break;
                }
                else if(matrix[row][column] > number)
                    column--;
                else
                    row++;
            }
        }
        return found;
    }
    View Code

    四 追加研究

          如果这个二维数组是n*n的方阵,那么可以考虑从左上角开始比较,沿着对角线比较。

    在上面的举例中,7>1,然后比较7>4,接着比较7<10,因此知道7可能出现在第三行或者第三列,可以分别用二分查找。

  • 相关阅读:
    c语言中的数据变量类型,大小
    表达式* ptr ++和++ * ptr是否相同?
    再论i++ ++i
    Chapter 1 First Sight——2
    如何修改博客样式
    PAT1011
    Chapter 1 First Sight——1
    Preface
    L11,one good turn deserves another
    PAT1010
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4272401.html
Copyright © 2020-2023  润新知