题目:
在每行元素从左至右增大,每列元素从上到下增大的矩阵,即杨氏矩阵中,查找一个数是否存在。
解决思路:
(1)例如以下分析过程:
(2)我们可以遍历行;
(3)通过判断当前行的最后一个元素和当前行的第一个元素与要查找的元素的大小关系,逐步缩小查找范围。
实现代码:
#define ROW 3
#define COL 3
int FindNumber(int a[ROW][COL], int row, int col, int key)
{
int i, j;
int r = row - 1;
int c = col - 1;
for (i = 0; i < row; ++i)
{
if (a[i][c] > key)
col = col - 1;
else if (a[i][c] < key)
continue;
else
return 1;
if (a[i][c] = key)
return 1;
}
return 0;
}
int main()
{
int a[ROW][COL] = { 1, 2, 5,\
4, 7, 8,\
8, 9, 15 };
int key = 4;
int ret = FindNumber(a, ROW, COL, key);
printf("expected is 1, actual is %d\n", ret);
system("pause");
return 0;
}
这种方法实现了时间复杂度为O(n)。当然我们也可以通过两重循环,一行一行的每个元素取遍历对比,从而查找元素,只不过时间复杂度会达到O(n^2)。