图解:

#include <stdio.h>
#include <assert.h>
//从右上角可以查找
//array 数组名 rows 行 cols列 number 查找的数字
bool TwoArrayFind_number(int *array,int rows,int cols,int number)
{
bool count = false;
assert(array != NULL);
if (rows <= 0 && cols <= 0)
{
return -1;
}
int row = 0;
int col = cols-1;//从右上角开始
while(row < rows && col >= 0)
{
if (array[row * cols + col] == number)
{
count = true;
break;
}
else if (array[row * cols + col] > number)
{
col--;//列左移一个格子
}
else
{
row++;//行下移一个格子
}
}
return count;
}
int main()
{
//测试用例 *谨记行移动一次乘以总列数(而不是变化的列)
//判断编译器下的真假值
printf("%d\n",true);//真为1
int arr[17] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
//数组中介于最大值最小值之间
printf("%d\n",TwoArrayFind_number(arr,4,4,7));
//数组最小值
printf("%d\n",TwoArrayFind_number(arr,4,4,1));
//数组最大值
printf("%d\n",TwoArrayFind_number(arr,4,4,15));
//大于数组最大值,不存在数组中
printf("%d\n",TwoArrayFind_number(arr,4,4,16));
//小于数组最小值,不存在数组中
printf("%d\n",TwoArrayFind_number(arr,4,4,0));
//介于数组最大值与最小值之间,但是不存在数组中
printf("%d\n",TwoArrayFind_number(arr,4,4,5));
//特殊测试:空指针
printf("%d\n",TwoArrayFind_number(NULL,4,4,15));
return 0;
}
//从左下角可以查找
//array 数组名 rows 行 cols列 number 查找的数字
bool TwoArrayFind_number2(int *array,int rows,int cols,int number)
{
bool count = false;
assert(array != NULL);
if (rows <= 0 && cols <= 0)
{
return -1;
}
int row = rows-1;//从左下角开始
int col = 0;
while(col < cols && row >= 0)
{
if (array[col * rows + row] == number)
{
count = true;
break;
}
else if (array[col * rows + row] > number)
{
row--;//行上移一个格子
}
else
{
col++;//列右移一个格子
}
}
return count;
}
int main()
{
//测试用例 *谨记列移动一次乘以总行数(而不是变化的行)
//判断编译器下的真假值
printf("%d\n",true);//真为1
int arr[17] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
//数组中介于最大值最小值之间
printf("%d\n",TwoArrayFind_number2(arr,4,4,7));
//数组最小值
printf("%d\n",TwoArrayFind_number2(arr,4,4,1));
//数组最大值
printf("%d\n",TwoArrayFind_number2(arr,4,4,15));
//大于数组最大值,不存在数组中
printf("%d\n",TwoArrayFind_number2(arr,4,4,16));
//小于数组最小值,不存在数组中
printf("%d\n",TwoArrayFind_number2(arr,4,4,0));
//介于数组最大值与最小值之间,但是不存在数组中
printf("%d\n",TwoArrayFind_number2(arr,4,4,5));
//特殊测试:空指针
printf("%d\n",TwoArrayFind_number2(NULL,4,4,15));
return 0;
}既然左下角、右上角都说了,不妨说一下左上角,其实左上角找也可以,逻辑思想更符合平常的理解,但是首先它要卡出一个范围,即把这个数字与两列进行比较,把一开始的大范围缩小,然后再按照右上角的方法进行“回退”,即下移或者左移,直到找到查找的数字为止。但是用左上角找注意的是,有序是指每一列、每一行。有时候会出现“漏掉”的可能,比如上述图中的'6'就是一个不错的测试用例,用在左上角查找时。(自己去发现吧
)
1480



被折叠的 条评论
为什么被折叠?



