想法:首先我们如果利用循环逐个去找,时间复杂度就会等于0(n);接下来我们看到题目说是这个数组是从左到右递增,从上到下递增,利用行和列我们就会将问题变得简单。
举个例子:
上述假若要找的数字大于右上角的数字那么我们就删除右上角数字所在的那一行。
假若找不到打印not find,找到了就打印行列号
程序如下:
结果:
int yang_find(int yang[][3], int size, int n)
{
assert(yang);
assert(size>0);
int i = 0;
int j = 2;
while (i<size && j>=0)
{
if (yang[i][j] > n){
j--;
}
else if (yang[i][j] < n){
i++;
}
else
{
return 'y'; //找到了
}
}
return 'n'; //没找到
}
int main()
{
int n=2;
int yang[][3] = {
{ 1, 3, 4 },
{ 2, 4, 5 },
{ 4, 5, 6 },
};
int size = sizeof(yang) / sizeof(yang[0]);
int ret=yang_find(yang, size, n);
printf("%c\n", ret);