在二维数组中查找



面试题3:二维数组中查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一行都按照从上往下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个数,判断数组中是否含有该整数。

  例如下面的二维数组就是每行,每列都是按照递增的顺序排序,如果在这个数组中查找7,则返回true,如果查找5,则返回false

  1. 2   8   9

  2. 4   9   12

  1. 7   10  13

6  8   11  15

  如果按照常规的方法,我们是可以一次查找的,但是这种方法效率不高,时间复杂度

很大,并且并没有用到该数组的规律。

因此我的解题思路是:

  1. 我们可以先从右上角开始查找;

  2. 如果比它大的话就在该数的这一列下面

  3. 如果比他小的话就在该数的前一列

我的代码如下:

 #include<stdio.h>

#include<assert.h>

 

#define  ROW 4

#define  COL 4

 

bool FindNumber(int arr[][COL],int number)

{

    assert(arr != NULL);

    int find=false;

 

    int i=0;

    int j=COL-1;

    for(; i<ROW,j<COL;)

    {

       if(i>ROW || j<0)

       {

           break;

       }

       else if(number == arr[i][j])

       {

           find = true;

           break;

       }

       else if(number > arr[i][j])

       {

           i++;

       }

       else if(number < arr[i][j])

       {

           j--;

       }

    }

    return find;

}

 

int main()

{

    int arr[ROW][COL]={1,2,8,9,

                      2,4,9,12,

                      4,7,10,13,

                      6,8,11,15};

    inta=FindNumber(arr,7);

    if(a == true)

    {

       printf("此数组中有该数字\n");

    }

    else

    {

       printf("此数组中没有该数字\n");

    }

 

    return 0;

}

当查找 7 时结果:

当查找 5 时结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值