问题描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
问题分析
例如下面得二维数组就是每行每列都递增的排序。如果查找数字7,返回true;如果查找数字5,返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
从上面的二维数组可以看出,最右下角的数字15是最大的,最左上角的数字1是最小的。
如果要查找一个数字7的话,可以从右上角9或左下角6开始查找,如果查找的数字比该数字小的话,则向左移;如果查找的数字比该数字大的话,则向下移;
步骤:
1、首先选取数组中右上角的数字。
2、如果该数字等于要查找的数字,查找过程结束;
3、如果该数字大于要查找的数字,向左移,剔除这个数字所在的列;
4、如果该数字小于要查找的数字,向下移,剔除这个数字所在的行;
代码实现
bool FindNum(int *arr,int rows,int colmus,int num)
{
assert(arr);assert(rows);assert(colmus);
//从右上角开始找,
int r = 0; int c = colmus - 1;
while (r < rows && c >=0)
{
if (*(arr + r*colmus + c) >num)
c--;
else if (*(arr + r*colmus + c) < num)
r++;
else
return true;
}
return false;
}
用vector 实现
bool Find(int target, vector<vector<int> > array)
{
//从右上角或者左下角开始查找
int row = array.size();
int col = array[0].size();
if (row == 0 && col == 0)
return false;
for (int i = 0, j = col -1; i < row && j >= 0;)
{
if (array[i][j] < target)
{
i++;
}
else if (array[i][j] > target)
{
--j;
}
else
return true;
}
return false;
}
699





