一.题目
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
例如:从下面的二维数组中查找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; } }
四.本题考点
- 考查应聘者对二维数组的理解及编程能力。二维数组在内存中占据连续的存储空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应的元素。
- 考查应聘者分析问题的能力。当应聘者发现问题比较复杂时,能不能通过具体的例子找出其中的规律,是能否解决这个问题的关键所在。这个题目只要从一个具体的二维数组的右上角开始分析,就能找到查找的规律,从而找到解决问题的突破口。