//杨氏矩阵
有一个二维数组.
数组的每行从左到右是递增的,每列从上到下是递增的.
在这样的数组中查找一个数字是否存在。
时间复杂度小于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
【解题思路】
因为数组的每行从左到右是递增的,每列从上到下是递增的.
定义行 i,列 j 置于一行中最后一位(即一行中最大的数字),定义一个temp第一行最后一个数字
比较temp与所给值(num)得大小。
如果num>temp,i++,比较下一行大小
如果num<temp,说明数字可能在这一行,则 i 不变,递减 j。
如果相等,则返回1
如果遍历完全,没有找到返回0
#include<stdio.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
int Search(int arr[ROW][COL], int num)
{
int i = 0;
int j = COL - 1;
int temp = arr[i][j];
while (1)
{
if ((num > temp) && (i < ROW - 1))
{
temp = arr[++i][j];
}
else if ((num<temp) && (j>0))
{
temp = arr[i][--j];
}
else if (num == temp)
{
return 1;
}
else
return 0;
}
}
int main()
{
int arr[ROW][COL] = {
{ 1, 3, 4 },
{ 2, 4, 5 },
{ 4, 5, 6 },
};
int num = 0;
printf("请输入要查找的数字!\n");
scanf("%d",&num);
if (Search(arr, num) == 1)
{
printf("找到了!\n");
}
else
{
printf("不存在此数!\n");
}
system("pause");
return 0;
}