更多剑指offer面试习题请点击: 《剑指offer》(第二版)题集目录索引
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:杨氏矩阵的特点是它的行和列的数都是递增的,所以我们可以选择它的一个顶点元素作为比较对象。比如我在下面这个数组中查找数字2。
①把a[0][3]处的元素4和2比较,2<4,所以2肯定不在第3列(因为4是第三列最小的元素,下面的元素都比4大,自然都比2大),我们就把第三列排除。
②把a[0][2]处的元素3和2比较,2<3,所以2也肯定不在第2列,我们就再把第2列排除。
③把a[0][1]处的元素2和2比较,2==2,2找到了,查找结束。
②把a[0][2]处的元素3和2比较,2<3,所以2也肯定不在第2列,我们就再把第2列排除。
③把a[0][1]处的元素2和2比较,2==2,2找到了,查找结束。
如果查找的数是6,6>4,那么就把第0行排除(因为4是第0行最大的元素,6都比这行最大的元素大,那其他元素肯定是小于6的),然后开始从a[1][3]比较 ,以此类推,找不到就排除这一行,直到找到或者找不到为止。
int Find(int* matrix, int rows, int columns, int number)
{
assert(matrix != NULL);
int ret = 0;
if (rows > 0 && columns > 0)//数组不能为空
{
int row = 0;
int column = columns - 1;
while (row < rows && column >= 0)
{
if (matrix[row * columns + column] == number)//先比较坐标为(0,2)的元素,相等则把ret置为1
{
ret = 1;
break;
}
else if (matrix[row * columns + column] > number)
--column;//如果大于要查找的数,排除这列
else
++row;如果小于要查找的数,排除这一行
}
}
return ret;
}
int main()
{
int matrix[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int number = 5;
int result = Find(matrix, 3, 3, number);
if (1 == result)
printf("got it\n");
else
printf("Don't get it\n");
system("pause");
return 0;
}
查找5,查找成功
.
.
.
查找10,查找失败