题目描述:
在一个二维数组中,每行都按从左到右的方向递增排序,每列按从上到下的方式递增排序。完成一个函数,输入一个要查找的数num和这个二维数组,判断这个二维数组中是否有这个值。
分析:
办法就是现在这个二维数组中找到一个值,和num比较大小:相同,则return True;否则不相同 :num大于这个值的话一定是在这个数的右方和下方区域,num小于这个值的话一定是在这个数的左下方区域。
相对简单的就是把二维数组中的这个要和num进行比较的数放在右上角或者左下角区域。
放右上角:这样若num大于这个值就删除这整个行;若num小于这个值就删除这整个列,然后在剩下的区域继续寻找。
放左下角:这样若num大于这个值就删除这整个列;若num小于这个值就删除这整个行,然后在剩下的区域继续寻找。
代码:
bool find(int a[4][4],int rows,int cols,int num)
{
bool found = false;
if(a == nullptr || rows<0 || cols<0)
return found;
int row = 0, col = cols-1;
while(row<rows && col>=0)
{
if(num == a[row][col])
{
found = true;
break;
}
else if(num > a[row][col])
++row;
else
--col;
}
return found;
}
bool find(int a[4][4],int rows,int cols,int num)
{
bool found = false;
if(a == nullptr || rows<0 || cols<0)
return found;
int row = rows-1, col = 0;
while(row>=0 && col<cols)
{
if(num == a[row][col])
{
found = true;
break;
}
else if(num < a[row][col])
--row;
else
++col;
}
return found;
}
在源码中,用的就是一维数组打印法,调用:Find(matrix, rows, columns, number);
,传参:bool Find(int* matrix, int rows, int columns, int number)
,打印:matrix[row * columns + column]
。
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false;
if(matrix != nullptr && rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while(row < rows && column >=0)
{
if(matrix[row * columns + column] == number)
{
found = true;
break;
}
else if(matrix[row * columns + column] > number)
-- column;
else
++ row;
}
}
return found;
}
笔记:
int a;
表示一个内存空间,这个空间用来存放一个整数(int);int* a;
表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间;int** a;
表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间;int (*a)[4];
表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4、类型为int的数组;和int** a
的区别在于,++、+=1之后的结果不一样,其他用法基本相同。int (*a)(int);
表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
对于二维数组的初始化还要注意以下几点:
int a[3][3] = {{1}, {2}, {3}};
int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
a[x][y]
在一维数组b中,是:a[x][y] = b[x*列数+y]
int **a;
a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行
//为每列分配4个大小空间
for (int i = 0; i < 3; ++i)
{
a[i] = (int*)malloc(sizeof(int)*4);
}
//初始化
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 4; ++j)
{
a[i][j] = i+j;
}
}
//输出测试
for (i = 0; i < 3; ++i){
for (j = 0; j < 4; ++j){
printf ("%d ", a[i][j]);
}
printf ("\n");
}
//释放动态开辟的空间
for (i = 0; i < 3; ++i){
free(a[i]);
}
free(a);
return 0;
}
/*
输出:
0 1 2 3
1 2 3 4
2 3 4 5
*/
print1(arr, 3, 5);
, 传参void print1(int arr[3][5], int row, int col)
void print1(int arr[3][5], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
print1(arr, 3, 5);
return 0;
}
(*arr)[5]
,这里与3也就没有任何关系了。void print2(int (*arr)[5], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
print2(arr, 3, 5);
return 0;
}
void print3(int *arr, int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf("%d ", arr[i*row+j]);
}
printf("\n");
}
}
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9};
print3(arr, 3, 3);
return 0;
}