题目1384:二维数组中的查找

6 篇文章 0 订阅
题目描述:

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

输入:

输入可能包含多个测试样例,对于每个测试案例,

输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。

输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。

接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

输出:

对应每个测试案例,

输出”Yes”代表在二维数组中找到了数字t。

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

样例输入:
3 3
5
1 2 3
4 5 6
7 8 9
3 3
1
2 3 4
5 6 7
8 9 10
3 3
12
2 3 4
5 6 7
8 9 10
样例输出:
Yes
No
No

之前的代码一直超时,后来将cin换成scanf后,得到AC结果。
另外,还有一个困扰我的问题是,声明了1000*1000的二维数组,编译器异常,应该是超出了栈的大小限制。但是,提交后依然AC。
贴出AC代码:
 

#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main()
{
    int m,n,key;
    int arr[1000][1000];
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        scanf("%d",&key);
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
               scanf("%d",&arr[i][j]);
                 
        bool found = false;
        int row = 0;
        while(row<m&&n>0)
        {
            if(arr[row][n-1]==key)  
            {
                found = true;
                break;                       
            }  
            else if(arr[row][n-1]<key)  
            {
                row++;                     
            }   
            else if(arr[row][n-1]>key)  
            {
                n--;                     
            }                  
        } 
        if(found) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;               
    }
 
    return 0;   
} 
 
/**************************************************************
    Problem: 1384
    User: 小燧石
    Language: C++
    Result: Accepted
    Time:690 ms
    Memory:5356 kb
****************************************************************/
 
 
关于大数组超出栈的大小的问题,在之后我查阅的相关的资料,进行了对应的实验。总结有这样几种解决方法:
1、可以将大数组声明为全局变量或者static静态局部变量。因为静态变量和全局变量是在全局数据区分配内存。
2、使用动态内存,运用new或者mallco.
  
        int ** arr = new int *[m];

        for (int i = 0; i < m; i ++)

        {

            arr[i] = new int [n];

            for (int j = 0; c < j; c ++)

            {
                scanf("%d", &arr[i][j]);

            }

        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值