有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。
要求:时间复杂度小于O(N);
1.首先更直观地了解一下杨氏矩阵:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
这就是一个简单的杨氏矩阵。
2.查找思路
(1)每次查找都是与最右上角位置地元素进行比较;
(2)如果目标数字比最右上角位置地元素大,则去掉最上面的一行;
(3)如果目标数字比最右上角位置地元素小,则去掉最右边的一列;
- 比如说目标数字是 8 ,先与最右上的 3 进行比较, 8 > 3 ,说明 8 大于这一行所有的元素,8 必定不在 3 所在的行内,所以去掉:
- 去掉一行后,又与最右上的 6 进行比较,8 > 6 ,说明8 大于这一行所有的元素,8 必定不在 6 所在的行内,所以去掉:
- 又去掉一行后,与最右上的 9 进行比较,8 < 9 ,说明 8 小于 9 这一列所有的元素(此时因为第一第二行已经去掉了,所以剩下 9 这一列的元素必定都大于8),8 必定不在 9 所在的列内,所以去掉:
- 当矩阵中比较的元素就是目标数字时,证明找到了,目标数字在矩阵当中。
3.具体代码如下:
#include<stdio.h>
SearchNum(int arr[3][3], int target,int row,int col)
{
int i = 0;
int j = col - 1;
while (i <= row && j > 0)
{
if (arr[i][j] < target)
{
i++;
}
else if (arr[i][j] > target)
{
j--;
}
else return 1;
}
return 0;
}
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int target = 8;
int row = 3;
int col = 3;
if (SearchNum(arr, target, row, col))
{
printf("目标数字在矩阵当中\n");
}
else
{
printf("目标数字不存在矩阵当中\n");
}
return 0;
}
当然我们可以举一些更加大的矩阵例子来进行分析,这样思路会更加清晰。
谢谢大家!!!