您的位置:首页 > 编程语言 > C语言/C++

剑指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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息