题目:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N)。
代码:
思路1:一行一行比较,当遇到比num更大的数字时,转入下一行继续比较
int num_find(int arr[5][5], int* px, int* py, int num)
{
int x = 0;
int y = 0;
while (num != arr[x][y])
{
if (arr[x][y] < num && y < *py)
{
y++;
}
else if (x < *px)
{
x++;
y = 0;
}
else
return 0;
}
*px = x;
*py = y;
return 1;
}
int main()
{
int arr[5][5] = { {1,2,4,7,9},{2,3,5,11,15},{5,8,11,15,20},{6,7,12,16,23},{8,9,14,18,25} };
int num = 0;
scanf("%d", &num);
int x = 5;
int y = 5;
int ret = num_find(arr, &x, &y, num);
if (ret == 1)
printf("找到了,下标为:%d %d\n", x, y);
else
printf("没找到\n");
return 0;
}
思路2:右上角是一行中最大的数,同时是一列中最小的数。将待查找的数字与二维数组右上角比较,如果比右上角数字小,列数减1;如果比右上角数字大,行数加1。依次比较。
int num_find(int arr[3][3], int r, int c, int num)
{
int x = 0;
int y = c - 1;
while (x < r && y >= 0)
{
if (arr[x][y] < num)
x++;
else if (arr[x][y] > num)
y--;
else
return 1;
}
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int num = 0;
scanf("%d", &num);
int ret = num_find(arr, 3, 3, num);
if (ret == 1)
printf("找到了\n");
else
printf("没找到\n");
return 0;
}
思路2增加打印下标
int num_find(int arr[3][3], int* px , int* py, int num)
{
int x = 0;
int y = *py - 1;
while (x < *px && y >= 0)
{
if (arr[x][y] < num)
x++;
else if (arr[x][y] > num)
y--;
else
{
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
int num = 0;
scanf("%d", &num);
int x = 3;
int y = 3;
int ret = num_find(arr, &x, &y, num);
if (ret == 1)
printf("找到了,下标是:%d %d\n", x, y);
else
printf("没找到\n");
return 0;
}