二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和整数,判断数组中是否含有该整数。
解题思路:我们以下面3*3的矩阵(该矩阵符合题目的要求)为例,对该题进行分析。当我们要查找的元素为“10”时,由于该矩阵中不存在,因此返回false,当我们要查找的元素为“5”时,由于该矩阵你 中存在,因此返回true。
通过观察矩阵,不难发现该矩阵的规律还是很明显的。矩阵的左上角的元素是该矩阵中最小的元素,左下角的元素是该行元素中最小的,但却是该列元素中最大的,相反,矩阵上角的元素是该行元素最大的,但却是该列元素最小的,矩阵右下角的元素是该矩阵中元素最大的。
看到这里,我么不难想到,定一个“标志数”将它和我们要查找的数不断地进行比较,从而可以确定我们要查找的数是否存在于该数组,但是我们该怎么定这个“标志数”呢?(上面说的四个角,一一进行分析)
由于左下角和右上角都可以作为“标志数”,很多博客中也有右上角的做法图,在这里,我以左下角为例,通过下图的几个过程来对查找元素“5”进行分析(右上角同理),但是代码实现的时候两者都实现!
代码实现如下:
1.vector版本的右上角
bool Find(int target, vector<vector<int>> array)
{
//判空
if (array.empty())
return false;
int rows = array.size();
int cols = array[0].size;
int x = 0;
int y = cols - 1;
bool found = false;
while (x >= 0 && y >= 0 && x < rows &&y < cols)
{
if (array[x][y] == target)
{
return true;
}
else if (array[x][y]>target)
{
x++;
}
else
{
y--;
}
}
return found;
}
1.vector版本的左下角
//vector左下角
bool Find(int target, vector<vector<int>> array)
{
if (array.size == 0)
return false;
int rows = array.size();
int cols = array.size();
int x = rows - 1;
int y = 0;
int found = false;
while (x >= 0 && y >= 0 && x < rows&&y < cols)
{
if (array[x][y] == target)
{
return true;
}
else if (array[x][y]>target)
{
y++;
}
else
{
x--;
}
}
return found;
}
注意:在本题中,使用vector时,左下角和右上角的区别在于对于坐标x和y的位置控制上,以及对应的行和列的加减操作。
3.矩阵版本的右上角
//矩阵右上角
bool Find(int* matrix, int rows, int cols, int number)
{
bool found = false;
if (matrix == NULL || rows <= 0 || cols <= 0)
return found;
while (matrix != NULL&&rows > 0 && cols > 0)
{
//定义右上角
int x = 0;
int y = cols - 1;
if (matrix[x*cols + y] == number)
{
return true;
}
else if (matrix[x*cols + y] > number)
{
x--;
}
else
{
y++;
}
}
}
4.矩阵版本的左下角
bool Find(int* matrix, int rows, int cols, int number)
{
bool found = false;
if (matrix == NULL || rows <= 0 || cols <= 0)
return found;
while (matrix != NULL&&rows > 0 && cols > 0)
{
//定义左下角
int x = rows - 1;
int y = 0;
if (matrix[x*cols + y] == number)
{
return true;
}
else if (matrix[x*cols + y] > number)
{
x--;
}
else
{
y++;
}
}
}
注意:本题使用矩阵实现本题时,同样,和使用vector一样都需要注意矩阵位置的控制,还有就是,可能很多人对于“marix[x*cols+y]”有一些疑惑,举个例子,大家就不难理解了(例如右上角,它的位置相当于[0,2],用0*cols+2得到的数字就是我们要寻找的右上角的元素“3”)!
int main()
{
int sz[] = { 1, 2, 3,
4, 5, 6,
7, 8, 9 };
bool b = Find(sz, 3, 3, 5);
cout << b << endl;
getchar();
return 0;
}
下一篇: Leetcode - 逆波兰表达式求值