面试题4:二维数组中的查找

一.题目

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

例如:从下面的二维数组中查找7返回true,查找5返回false

         1   2   8    9

         2   4   9   12

         4   7   10  13

         6   8   11  15

二.思路

        如果从左上角或右下角开始查找,则要考虑的情况比较多,而从右上角或左下角考虑的话,则情况较少,这里我们从右上角开始查找。

三.代码

bool find(int** nums,int rows,int columns,int target){
    
    if(nums == nullptr || columns <= 0 || rows == 0)
        return false;

    int row = 0;
    int column = columns - 1;
    while(column >= 0){

        if(nums[row][column] == target)  //如果传入参数是一维数组,则变为nums[row * columns + column]
            return true;

        else if (nums[row][column] > target)
            --column;

        else
            ++row;
    }

}

四.本题考点

  • 考查应聘者对二维数组的理解及编程能力。二维数组在内存中占据连续的存储空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应的元素。
  • 考查应聘者分析问题的能力。当应聘者发现问题比较复杂时,能不能通过具体的例子找出其中的规律,是能否解决这个问题的关键所在。这个题目只要从一个具体的二维数组的右上角开始分析,就能找到查找的规律,从而找到解决问题的突破口。
原文地址:https://www.cnblogs.com/ovs98/p/9854837.html