剑指offer题三:二维数组中的

题目描述:

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

输入:

输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。
输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。
接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

输出:

对应每个测试案例,
输出”Yes”代表在二维数组中找到了数字t。

输出”No”代表在二维数组中没有找到数字t。


分析 :

           从右上角开始比较,如果刚好相等,那么直接返回true;

           如果要找的数比右上角的大,说明所在的这一行不用比较,那么行数加1 到下一行的右上角比较;

            如果要找的数比右上角的小,说明所在的列不用不叫,那么列数减1,到前边伊一列的右上角比较;

因为开始是在九度OJ上做的,所以就是直接按照他的格式来的。

方法一是使用了 动态分配二维数组方式,这方式直接但是分配的数组 只有同一行的在内存中是连续的,但不能保证不同行在内存中连续,例如第二行地址不一定紧接在第一行后面

方法二是使用了 一种折中的方式,利用一维数组来存储二维数组,在函数传参上也不易出错。

当然 很多时候我们也会用数组的方式,只是会define一个MAX作为初始值,但总觉得这种太死板了

方法1:

#include <stdio.h>
#include <malloc.h>
#define MAX 10
bool ifIncluded(int **data,int m,int n,int num)   //二维数组参数
{
       int i=0,j=n-1,temp;
       while(i<m && j>=0)
       {
            temp= *(*(data+i)+j);  //二维数组访问
            if(num ==temp )
                return true;
            if(num > temp)
                i++;
            else j--;
       }
       return false;
}
int main(void)
{
    int m,n,num;
    int **data;
    int i,j,count=-1;
    bool result[MAX]={false};
   while(scanf("%d%d%d",&m,&n,&num)!=EOF)
   {
        count++;
        data=(int**)malloc(sizeof(int*)*m);
        for(i=0;i<m;i++)
            data[i]=(int*)malloc(sizeof(int)*n);
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                scanf("%d",&data[i][j]);
        if(ifIncluded(data,n,m,num)) result[count]=true;
        else result[count]=false;
        for(i=0;i<m;i++)     //自己malloc,自己free
            free(data[i]);
        free(data);

    }

    for(i=0;i<=count;i++)
        if(result[i])
            printf("Yes\n");
        else printf("No\n");
    free(result);
    return 0;

}

方法2:

#include <stdio.h>
#include <malloc.h>
#define MAX
#define false 0   //这是因为不这么做的话 OJ会提示 false,true undeclared
#define true 1
int ifIncluded(int *data,int m,int n,int num)   //使用一维数组存储二维数组
{
    int i=0,j=n-1,temp;
    if(!data || m <=0 || n<=0) return false;
    if(data[0]>num  || data[m*n-1]<num) return false;
    if(data[0]==num || data[n*m-1]==num)
        return true;
    while(i<m && j>=0)
     {
            temp=*(data+i*n+j);    //使用一维数组存储二维数组时候的数组元素访问
           if(temp==num) return true;
           if(temp>num) j--;
           else i++;
     }
     return false;
}
int main(void)
{
    int m,n,num;
    int *data;
    int i,j,count=-1;
    int result[MAX]={false};
    int len=0;
    while(scanf("%d%d%d",&m,&n,&num)!=EOF)
   {

        printf("input  matrix\n");
        count++;
        len=m*n;
        data=(int*)malloc(sizeof(int)*m*n);
        for(i=0;i<len;i++)
            scanf("%d",&data[i]);

     if(ifIncluded(data,m,n,num)) result[count]=true;
     else result[count]=false;
     free(data);   //自己malloc 自己free
    }
    for(i=0;i<=count;i++)
        if(result[i])
            printf("Yes\n");
        else printf("No\n");
    free(result);
    return 0;

}

测试用例:

1 positive: 所找元素在矩阵中,等于最小的元素,等于最大的因素,介于最大与最小中间;

2 negative:所找元素不在矩阵中,小于最小元素,大于最大的元素,介于最大与最小中间但是不存在的;

4 invalid:输入的数组为空等。

知识点:

1 对二维数组的分配方式(静态,动态)的使用,及怎么传入二维数组参数。更加详细可以参见 http://www.cnblogs.com/wuyuegb2312/archive/2013/06/14/3135277.html

2 我自己总是在scanf时候忘了 &!!! 像 &data[i][j]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值