目录
一、问题描述
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
二、问题分析
根据题目,矩阵每行从左到右递增,从上到下递增,那可以用以下图片来大概描述这个矩阵里数字的大小:
也就是想在这样的矩阵里找到某个数字是否存在。时间复杂度小于O(N),也就是说时间复杂度需要是O(1)或者O(logN)。
三、算法设计
可以将矩阵抽象成数组。
假设这个矩阵里的数字是1,2,3,4,5,6,7,8,9。要查找的数字是7。
在矩阵中,任何一个数,它的右边和下边的数必然大于它,它的左边和上边的数必然小于它。
那么,可以利用这一特点来查找。
如果要查找的数比遍历到的元素大,那我就向下查找;
如果比遍历到的元素小,那我就向左查找。
以下几张图演示查找过程:
四、代码实现
#include <stdio.h>
int find_k(int arr[3][3], int *px, int *py,int k)
{
int x = 0;
int y = *py - 1;
while (x<=*px-1&&y>=0)
{
if (arr[x][y] < k)
{
x++;
}
else if (arr[x][y] > k)
{
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 k = 7;
int x = 3;
int y = 3;
int ret=find_k(arr,&x,&y,k);
if (ret == 0)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d %d", x, y);
}
return 0;
}