您的位置:首页 > 职场人生

《剑指Offer》面试题:二维数组中的查找

2015-08-30 14:26 706 查看
题目

题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。

输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。

思路

由于数组时有序的这样一个前提,因此

从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列;这样就可以将查找范围逐渐缩小,直至完成搜索

当然也可以从右下角开始查找,但是不可以从左上角或者是左下角开始查找(因为这样不能缩小查找范围)

测试用例

测试用例需要考虑的情况:

1) 二维数组中包含要查找的数字(例如最大值、最小值、中间的值)

2)二维数组中不包含要查找的数字,会有如下三种情况:

2.1)要查找的值小于二维数组中的最小值

2.2)要查找的值大于二维数组中的最大值

2.3)要查找的值在二维数组的最大值与最小值之间但是不存在此值。

3)特殊输入测试(空指针)

代码实现如下

/*
面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序。
输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数。

测试用例需要考虑的情况:
1) 二维数组中包含要查找的数字(例如最大值、最小值、中间的值)
2)二维数组中不包含要查找的数字,会有如下三种情况: 
    2.1)要查找的值小于二维数组中的最小值
    2.2)要查找的值大于二维数组中的最大值
    2.3)要查找的值在二维数组的最大值与最小值之间但是不存在此值。
3)特殊输入测试(空指针) 
*/

#include<stdio.h>
#include<string.h>
#define N  4
#define M  4
/*
@param  arr:指针数组
@param  rows:数组的行数
@param  columns:数组的列数
@param  num:需要查找的数 

*/

void findNumInArray(int (*arr)
,int rows,int columns,int num){

    //先检查arr是否有效
    if(arr==NULL||rows<1||columns<1){
        return ;
    } 

    //开始在arr中寻找num是否存在
    //从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列 
    int row=0;
    int column=columns-1;
    bool flag=false;
    while(row<rows&&column>=0){//num==arr[row*columns+column
        int temp=arr[row][column];
            if(num==temp){
            flag=true;
            break;//跳出while循环 
        }
        else if(num<temp){//删除该列
            column--; 
        }
        else{//删除该行
            row++; 

        }

    }
    if(flag==true){
        printf("%d在上面数组中存在\n",num);

    }
    else{
        printf("%d在上面数组中不存在\n",num);
    }

}

int main(void){
    int arr
[M]={ 
    {1,2,3,7},  
    {3,5,6,8},  
    {4,7,8,9},  
    {6,8,10,12} 
    };
    //输出 
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            printf("%d  ",arr[i][j]);
        }
        printf("\n");
    }
//  int num;
//  scanf("%d",&num);
    //测试用例如下
    int num1=1;//最小值,在arr中存在 
    int num2=4;//中间值,在arr中存在 
    int num3=12;//最大值,在arr中存在
    //维数组中不包含要查找的数字的三种测试用例 
    int num4=0;
    int num5=20;
    int num6=11;

    findNumInArray(arr,N,M,num1); 
    findNumInArray(arr,N,M,num2); 
    findNumInArray(arr,N,M,num3); 
    findNumInArray(arr,N,M,num4); 
    findNumInArray(arr,N,M,num5); 
    findNumInArray(arr,N,M,num6);   
    return 0;
}


运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: