题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
Example:
如下面的二维数组,每行、每列都递增排序。如果 查找数字7,则返回true;如果查找数字5,则返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
问题解析:
- 从左到右,从上到下递增。
链接:
剑指Offer(第2版):P44
思路标签:
数据结构:数组
寻找直观简单的规律。
解答:
1. C++
- 本题对于初始判断元素的位置选取有很大的关系,如果我们从二维数组的中间选取,那么需要分三种情况进行讨论,且对后续的情况不容易进行处理,难以找出规律。从左上角开始,依然还是无法减小问题的规模。
- 如果从右上角开始讨论,对于大于需要寻找的元素的情况,就去掉该列;对于小于需要寻找的元素的情况,就去掉该行。不断减小问题需要寻找的规模,直至寻找到指定的元素为止。
- 这里我们仅需将二维数组作为连续地址空间处理即可,当然也可以使用二维vector。
一维数组:
class Solution {
public:
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){
if (matrix[row*columns + column] == number){
found = true;
break;
}
else if (matrix[row*columns + column] > number)
--column;
else
++row;
}
}
return found;
}
};
二维vector:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
bool found = false;
int rows = array.size();
int columns = array[0].size();
if (!array.empty()){
int row = 0;
int column = columns - 1;
while (row < rows && column >= 0){
if (array[row][column] == target){
found = true;
break;
}
else if (array[row][column] > target)
--column;
else
++row;
}
}
return found;
}
};
C++相关:
二维vector: