问题描述:
杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
1 2 3
4 5 6
7 8 9
问题分析:
1、题目要求时间复杂度小于O(N),所以我们就不能一个一个的对比。
2、根据数据特征,可见右上角和左下角的这两个数是最高效率的查找开始点。
3、输入数字,开始查找;
4、找到返回 1 ,没找到返回 0 。
源代码:
#include <stdio.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
int Findnum(int arr[ROW][COL], int row, int col, int key)
{
int left = 0;
int right = col - 1;
while ((left >= 0) && (right < col))
{
//如果这个数字小于key,则向后移一位;
if (arr[left][right] < key) {
left++;
}
//如果这个数字大于key,则向前移一位;
if (arr[left][right] > key) {
right--;
}
if (arr[left][right] == key) {
return 1;
}
}
return 0;
}
int main() {
int arr[ROW][COL] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("请输入要查找的数字:");
int key = 0;
scanf("%d", &key);
int ret = Findnum(arr, ROW, COL, key);
if (1 == ret)
{
printf("恭喜你,找到了!\n");
}
if (0 == ret)
{
printf("很抱歉,没找到!\n");
}
system("pause");
return 0;
}