剑指offer 面试题3 二维数组的查找

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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值