E:\arithmetic\Array2Find
P44
O(m+n)?
#include <stdio.h>
void find(int **arr, int row, int colume, int k);int main(int argc, char *argv[])
{
/*测试用例 a:k值在数组里(中间值 最大值 最小值),b:k值不在数组里(超过最大值 或者最小值 或者在之间但是没有) ,
c:传入的数组为null*/
int arr1[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int arr2[4][4]={{1,2,8,9},{2,4,9,12},{4,5,10,13},{6,8,11,15}};
int arr3 = NULL;
int i, j;
for(i = 0 ; i < 4 ; i++){
for(j = 0 ; j < 4 ; j++){
printf("%d\t", *( ( (int*)(arr1+i) + j) ));
}
printf("\n");
}
find(arr1, 4, 4, 7);
find(arr2, 4, 4, 7);
find(arr3, 4, 4, 7);
return 0;
}
void find(int **arr, int row, int colume, int k)//二维数组作为函数参数已退化成指针,如果定义成arr[][]后面也无法使用arr[i][j]
{
if(arr == NULL){
printf("error in failed, array is null!\n");
return ;
}
int i, j;
printf("---------\n");
for(i = 0 ; i < 4 ; i++){//退化成指针这样就不行了!! 表示a[i][j]
for(j = 0 ; j < 4 ; j++){
printf("%d\t", *( ( (int*)(arr+i) + j) ));
}
printf("\n");
}
i = 0;
j = colume - 1;
while( (i<row) && (j>=0)){
printf("a = %d, j = %d a[i][j] = %d\n", i, j, *( (int*)(arr+i*colume+j ) ));
if( *( (int*)(arr+i*colume+j )) == k){
printf("find! i = %d\tj=%d\n", i, j);
return;
}
else if(k < *( (int*)(arr+i*colume+j )) ){
j--;
}
else{
i++;
}
}
printf("fail to find!\n");
}