[九度OnlineJudge][剑指Offer]题目1384:二维数组中的查找

题目描述:

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

输入:

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

输入的第一行为两个整数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


#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
const int N=1001;
//如果下边的二维数组分配在main函数里边,数组维度为721及以下时,程序没有问题
//但是当维数超过721时,出现段错误Program received signal SIGSEGV, Segmentation fault
int array[N][N]={0};
//这个二维数组分配在堆上,如果分配在栈上,大数组会耗尽栈的空间,出现段错误
//因此解决办法为将大数组分配在堆上而不是栈上,可以是全局变量或者用new申请堆内存
int main()
{
    int m=0,n=0;
    bool flag=false;
    //freopen("input.txt","r",stdin);
 
    //只加这一句输入将被重定向到文件input.txt
//    while(cin>>m>>n) 很奇怪的事情 用C++  输入在第二个测试用例就超时,改成scanf就全部通过
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        int target=0;
        cin>>target;
//        vector<vector<int> > array;
//        int *array=new int[m*n];//为提高效率,避免多次动态分配堆内存
 
        int temp;
 
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
//                cin>>temp;
                  scanf("%d",&temp);
//                array[i*n+j]=temp;
                array[i][j]=temp;
            }
        int row=0;
        int colum=n-1;
        flag=false;
        while(colum>=0&&row<m)
        {
//            if(array[row*n+colum]==target)
            if(array[row][colum]==target)
            {
                flag=true;
                break;
            }
//            if(array[row*n+colum]>target)
            if(array[row][colum]>target)
                colum--;
            else
                row++;
        }
        if(flag==true)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
//        delete []array;
    }
    return 0;
}
 
/**************************************************************
    Problem: 1384
    User: fuestck
    Language: C++
    Result: Accepted
    Time:690 ms
    Memory:5432 kb
****************************************************************/


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值