转载请注明出处:http://blog.csdn.net/ns_code/article/details/24977113

剑指offer上的第三道题目。在九度OJ上測试通过

题目描写叙述:

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

输入:

输入可能包括多个測试例子,对于每一个測试案例,

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

时间限制:1 秒

内存限制:32 兆


採用二分查找法。时间复杂度为O(max(m,n))。

先将给定的值key与二维数组右上角的元素比較,若相等,则返回true。若key小于它。则最后一列的元素肯定都大于key,此时能够删除掉最后一列,而若key大于它,则第一行的元素肯定都小于key,此时能够删除掉第一行,依次向下比較,假设比較到了左下角的元素,还没有发现等于key的。则返回fasle。

实现代码例如以下:

#include<stdio.h>
#include<stdbool.h> /*
在m*n的升序二维数组matrix中查找是否有key
*/
bool Find(int *matrix,int m,int n,int key)
{
if(matrix==NULL || m<1 || n<1)
return false;
int row = 0;
int col = n-1;
while(row<=m-1 && col>=0)
{
if(matrix[row*n+col] == key)
return true;
else if(matrix[row*n+col] > key)
col--;
else
row++;
}
return false;
} int main()
{
int m,n;
while(scanf("%d %d",&m,&n) != EOF)
{
int key,i;
//不加static会产生栈内存溢出,
//假设不加static。matrix数组的内存在栈内分配。
//假设加static。matrix数组的内存分配在全局已初始化区。 //另外。此处用最大范围的数组。会增大所用内存,
//但假设用malloc动态分配,则会添加执行时间。 static int matrix[1000*1000] = {0};
scanf("%d",&key);
for(i=0;i<m*n;i++)
scanf("%d",matrix+i);
bool result = Find(matrix,m,n,key);
if(result)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
/**************************************************************
    Problem: 1384
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:680 ms
    Memory:4820 kb
****************************************************************/


【剑指offer】二分查找二维数组的更多相关文章

  1. 《剑指offer》查找二维数组内元素 c++

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

  2. 剑指offer:2.二维数组的查找(Java版)

    备注:本文参照<剑指offer第二版> 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数, 输入这样的一个二维数组和一个整数 ...

  3. 剑指offer(一):二维数组中的查找

    说明: 1.本系列是根据<剑指Offer>这个系列做的一个小笔记. 2.直接动力是因为师兄师姐找工作很难,而且机械出生的我面试算法更难. 3.刚开始准备刷LeetCode.LintCode ...

  4. 剑指offer一之二维数组中的查找

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

  5. 剑指offer一:二维数组中的查找

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

  6. 【剑指offer】04A二维数组中的查找,C++实现

    1.题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数数组和一个整数,判断数组中是否含有该整数. 2.思路 首先选取数 ...

  7. 【剑指offer】01 二维数组中的查找

    题目地址:二维数组中的查找 题目描述                                    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照 ...

  8. 【剑指 Offer】04.二维数组中的查找

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

  9. 【剑指Offer】04. 二维数组中的查找 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 日期 题目地址:https://leetcode-cn.com/ ...

  10. 《剑指Offer》之二维数组中的查找

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 pu ...

随机推荐

  1. 小程序获取当前页面路径url

    getCurrentPages()[0].route

  2. CentOS 7编译openssl

    # 编译安装zlib库wget http://zlib.net/zlib-1.2.11.tar.gztar -zxvf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./conf ...

  3. 通过maven-war-plugin插件对war包分环境打包

    针对多环节,从源头打包入手,当然这些都可以在运维阶段用脚本进行替换来代替 resources/environment/下有四个环境,local本地.dev开发.test测试.pre预上线.prod生产 ...

  4. MVC如何避免控制器方法接收到的值不能被转换为参数类型

    假设控制器方法参数类型是int: public ActionResult GetSth(int id) { return Content(id.ToString()); } 而视图传递过来的是字符串: ...

  5. MFC绘制直方图和饼图

    转载原文: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...

  6. [java web 入门](一)MyEclipse &amp; HelloWorld 记录

    第一部,下载安装MyEclipse for mac. http://downloads.myeclipseide.com/downloads/products/eworkbench/2014/inst ...

  7. weblogic 12C 安全加强:更改Console及管理端口

    一.管理端口的好处:1.由于我们使用的是weblogic直接提供web访问,所以防火墙无法对80端口做安全策略. 2.所有用户都可以使用http://www.reyo.cn/console/来登陆我们 ...

  8. nginx: [emerg] "proxy_cache_path" directive is not allowed here in /usr/local/nginx/conf/nginx.conf:43

    1.它只能使用于http{  }部分,把proxy_cache_path放置于http部分即可解决此问题.注意图示的上下文

  9. C/C++ 语言获取文件大小

    在C语言中测试文件的大小,主要使用二个标准函数. 1.fseek 函数原型:int fseek ( FILE * stream, long int offset, int origin ); 参数说明 ...

  10. C++分布式实时应用框架——系统管理模块

    一个分布式实时系统集群动辄上百台机器,集群的规模已经限定这将是一个”封闭“的系统.你不可能再一台台去操作上百台机器,传统的人工运维方式早已不能满足当下需要,所有对集群或者集群中某个节点的操作都必需通过 ...