杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 54 5 6
这里我们通过分析可知,四个角有不同的特点。
左上角:位于左上角的数是所有行和列最小的数,以此为标准来进行搜索。
左下角:位于左下角的数是第一列中最大的数和最后一行中最小的数,以此为标准来进行搜索。
右上角:位于右上角的数是第一行中最大的数和最后一列中最小的数,以此为标准来进行搜索。
右上角:位于右下角的数是所有行和列最大的数,以此为标准来进行搜索。
因此我选取右上角的数为标准来实现代码:
#define _CRT_SECURE_NO_WARNINGS 0
#include <stdio.h>
#include <windows.h>
#define rows 3
#define cols 3
int find(int arr[][cols], int row, int col, int data)
{
int i = 0;
int j = col - 1;
while (i < row && j >= 0) //只有下表为0,1,2的行和列才能进入循环
{
if (arr[i][j] > data)
{
j--; //若是输入的数小于标准,列--
}
else if (arr[i][j] < data)
{
i++; //若是输入的数大于标准,行++
}
else
{
return 1;
}
}
return 0;
}
int main()
{
int arr[rows][cols] =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
};
int input = 0;
printf("请输入:");
scanf("%d", &input);
int is_exist = find(arr, rows, cols, input);
if (is_exist)
{
printf("%d找到了!\n", input);
}
else
{
printf("%d找不到了!\n", input);
}
system("pause");
return 0;
}