当前位置: 首页 > news >正文

[九度—剑指offer]—二维数组查找

本题来自《剑指offer》面试题3

题目描述:

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

输入:

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

输入的第一行为两个整数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 
  思路:对于这种二维数组查找,如果从最左上角[0][0]向中间走,每一步都会有两种方向可能。这样问题越来越复杂。如果抱着从右上角或者左下角思路开始分析,显然每次可以排除一列的值。如果[i][j]比右上角的值小,则本列已经不可能有target了。如果大,则本行已经不可能有target了。这个问题启示我们当有多个路径可选时,换一个边界入手,形成相互约束,减少考虑分支。
 提交代码:Time Limit Exceed
<span style="font-size:12px;">#include<iostream>
using namespace std;
 
bool search(int (*a)[1000],int m,int n,int target)
{
    int i=0,j=n-1;
    while(i<m && n>0){
        if(a[i][j]==target)return 1;
        else {
            if(a[i][j]>target)j--;
            else
                i++;
            }
    }
    return 0;
}
 
 
int main()
{
    int m,n,target,a[1000][1000];
    while(cin>>m>>n)
    {
        cin>>target;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                cin>>a[i][j];
        if(search(a,m,n,target))
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}</span>

居然将cin改为scanf就不超时了

   
#include<iostream>
#include <cstdio>
using namespace std;
 
bool search(int (*a)[1000],int m,int n,int target)
{
    int i=0,j=n-1;
    while(i<m && n>0){
        if(a[i][j]==target)return 1;
        else {
            if(a[i][j]>target)j--;
            else
                i++;
            }
    }
    return 0;
}
 
int main()
{
    int m,n,target,a[1000][1000];
    while(scanf("%d %d",&m,&n)!=EOF){
        scanf("%d",&target);
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&a[i][j]);
          if(search(a,m,n,target))
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

相关文章:

  • 人人都能当“苍天哥” 手把手教你制作游戏视频
  • Linux 2.6 中导出sys_call_table表修改系统调用函数
  • [九度 1510 剑指offer]—替换空格 数组插入逆向移动
  • 个人设置随身携带口袋操作系统手到擒来
  • 免费邮箱,谁更可靠?6款常用免费邮箱收信效果对比测试
  • 哪个搜索引擎更聪明?微软必应搜索挑战赛
  • [九度1512 剑指offer7] 用两个栈实现队列
  • 无光驱没光盘 操作系统照样可以安
  • mmap() 实现文件复制
  • [Linux内存管理-分页机制]—把一个虚拟地址转换为物理地址
  • C#也能动态生成Word文档并填充数据
  • Epoll实现服务器高并发
  • Linux中实现线程池
  • 《BREW进阶与精通——3G移动增值业务的运营、定制与开发》连载之18---商业模式...
  • 凤巢能否成功关键还看用户体验
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • happypack两次报错的问题
  • JAVA并发编程--1.基础概念
  • nodejs调试方法
  • Python学习之路16-使用API
  • Spring框架之我见(三)——IOC、AOP
  • WePY 在小程序性能调优上做出的探究
  • 初探 Vue 生命周期和钩子函数
  • 汉诺塔算法
  • 嵌入式文件系统
  • 实现简单的正则表达式引擎
  • 我感觉这是史上最牛的防sql注入方法类
  • 新手搭建网站的主要流程
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 06-01 点餐小程序前台界面搭建
  • scrapy中间件源码分析及常用中间件大全
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #Lua:Lua调用C++生成的DLL库
  • #每日一题合集#牛客JZ23-JZ33
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (¥1011)-(一千零一拾一元整)输出
  • (9)目标检测_SSD的原理
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (多级缓存)缓存同步
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (离散数学)逻辑连接词
  • (三)uboot源码分析
  • (算法)求1到1亿间的质数或素数
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)一些感悟
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *2 echo、printf、mkdir命令的应用
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • [《百万宝贝》观后]To be or not to be?
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [C#][DevPress]事件委托的使用
  • [HackMyVM]靶场 Quick3
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  • [HXPCTF 2021]includer‘s revenge