剑指offer(C++)——二维数组中的查找
2017-04-21 15:15
225 查看
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数思路:二维数组中查找是否包含某个整数,直接的做法就是进行暴力搜索,但是这样做的时间复杂度为O(n*n),效率很低。而且也没有充分利用本题中二维数组递增的特点。根据数组递增的特点,我们会发现如下规律:首先选取数组中右上角的数字,如果该数字等于要查找的数字,则查找结束;如果该数字大于要查找的数字,那么要查找的数字肯定不在这一列,因为列是从上到下递增的,于是我们就可以剔除这一列;同理,如果该数字小于要查找的数字,那么要查找的数字肯定不在这一行,我们就可以剔除这一行。也就是说吐过要查找的数字不在数组的右上角,我们每一次都从数组中查找范围内剔除一行或一列,从而缩小查找范围,直到找到要查找的数字,或者查找范围为空,整数不在数组当中。当然,本题还可以从左下角开始查找,方法类似,就不再详述。
代码实现:class Solution {
public:
/*算法从右上角元素开始比较,如果相等就返回;如果大于则列减少,否则行增加*/
bool Find(int target, vector<vector<int> > array) {
int rows = array.size(); //矩阵行数
int cols = array[0].size(); //矩阵列数
bool found = false;
if (rows > 0 && cols > 0)
{
int row = 0;
int col = cols - 1;
while (row < rows && col >= 0)
{
if (array[row][col] == target)
{
found = true;
break;
}
else if (array[row][col] > target)
--col; //剔除一列
else
++row; //剔除一行
}
}
return found;
}
/*算法从左下角开始比较,相等就返回;若大于则列增加,否则行减少*/
bool Find1(int target, vector<vector<int>> array)
{
int rows = array.size();
int cols = array[0].size();
bool found = false;
if (rows > 0 && cols > 0)
{
int row = rows - 1;
int col = 0;
while (row >= 0 && col < cols)
{
if (array[row][col] == target)
{
found = true;
break;
}
else if (array[row][col] > target)
--row;
else
++col;
}
}
return found;
}
};
相关文章推荐
- 剑指Offer——二维数组中的查找——C++
- 剑指offer第一题【二维数组中的查找】c++实现
- C++笔试题(剑指offer 面试题3 二维数组中查找数)
- 剑指offer:二维数组中的查找
- 剑指offer面试题3-二维数组中的查找
- 剑指Offer:二维数组中的查找
- 剑指Offer:二维数组中的查找
- 《剑指Offer》面试题-二维数组中的查找
- 【C++】二维数组中的查找
- 剑指offer:面试题三:二维数组中的查找
- 剑指offer(2) - 二维数组中的查找
- C++ 二维数组中的二分查找
- 剑指offer之二维数组中的查找
- 面试题03_二维数组中查找_剑指offer系列
- 剑指offer-面试题3.二维数组中的查找
- 《剑指Offer》学习笔记--面试题3:二维数组中的查找
- 《剑指Offer》面试题-二维数组中的查找
- 剑指offer:面试题03---二维数组的查找
- 剑指offer 面试题3 二维数组的查找
- (剑指Offer)面试题3:二维数组中的查找