目录
一、问题描述
二、问题分析
三、算法设计
四、代码实现
一、问题描述
有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于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;
}