题目:

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

思路:

最简单:每一行都使用二分法查找一遍。

更省时间:

二维数组从左到右从上到下递增。
从最后一行找到刚好比target大的位置x,则上一行小于x的角标对应的数均小于target,
移到上一行,在角标x到行末重复上一操作,
以此类推,
每上移一行所需要比较的数字越来越少。
在上述过程中若无法找到相等的数字则不存在。
在每一行找与target接近的数字的过程可以使用二分法,复杂度nlog(n)。

C++:

#include <iostream>
#include <vector> using namespace std; class Solution {
public:
bool Find(int target, vector<vector<int>> array) {
int col = array[].size() - ;
int low = , high = col;
int row = array.size()-;
for (int i = row; i >= ; i--) {
while (low <= high) {
int media = (low + high) / ;
if (target < array[i][media]) {
high = media - ;
}
else if (target > array[i][media]) {
low = media + ;
}
else {
return true;
}
}
//low = 0; 若保留则为每一行均使用简单粗暴的二分法
high = col;
}
return false;
}
}; int main()
{
Solution obj;
int target = ;
vector<vector<int>> arr = { {, , , }, {, , , }, {, , , }, {, , , } };
cout << obj.Find(target, arr) << endl;
cin.get();
cin.get();
return ;
}

Python:

# -*- coding:utf-8 -*-
class Solution:
def Find(self, target, array):
row = len(array)-1
col = len(array[0])-1
low = 0
high = col
for i in xrange(row,-1,-1): # 倒序
while low<=high:
media = (low+high)/2
if target<array[i][media]:
high = media-1
elif target>array[i][media]:
low = media+1
else:
return True
#low = 0 若保留则为吗,每一行均使用二分法直接查找
high = col
return False if __name__ == '__main__':
target = 7
array = [[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]]
obj = Solution()
print obj.Find(target, array)

上述代码在牛客网测试,用时和空间占用分别为:

C++:9ms,1372k

Python:300ms,5860k

【算法编程 C++ Python】二维数组查找的更多相关文章

  1. python 二维数组读入

    study from : https://www.cnblogs.com/reaptomorrow-flydream/p/9613847.html python 二维数组键盘输入 1 m = int( ...

  2. php利用array_search与array_column实现二维数组查找

    利用array_search与array_column实现二维数组查找,不用自己写个循环,减少工作量. <?php $userdb = array( 0 => array( 'uid' = ...

  3. (2)剑指Offer之二维数组查找和替换空格问题

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

  4. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  5. 《剑指Offer》算法题——二维数组查找

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

  6. 剑指Offer_编程题之二维数组中的查找

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

  7. Python二维数组构造

    周末用python要写个算法用到来二维数组, 一时间还不知道python怎么构造多维数组出来.看到一段不错的代码, 记录一下. Python使用list嵌套实现多维数组, PHP可以使用array嵌套 ...

  8. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

  9. python二维数组切片

    python中list切片的使用非常简洁.但是list不支持二维数组.仔细研究了一下发现,因为list不是像nampy数组那么规范.list非常灵活.所以没办法进行切片操作. 后来想了两个办法来解决: ...

随机推荐

  1. Weak Session IDs

    工具的使用 首先github上下载火狐插件(正版收费),按F12调用 服务器生成sessionID通过response返回给浏览器,sessionID存放在浏览器cookie中,然后再通过cookie ...

  2. activiti用户手册

    http://www.mossle.com/docs/activiti/index.html

  3. linux入门—安装linux系统(1)

    一,linux介绍 linux是一套免费使用和自由传播的类Unix操作系统,简单的说就是不要钱,你可以随便使用,也可以分享给其他人. (剩下的详细内容,个人认为百度百科的内容比我瞎讲强的多,网址:ht ...

  4. Java 之 MyBatis(一)入门

    一.Mybatis 框架概述 (1)mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动.创建连接.创 ...

  5. Celery:routing

    参考:http://docs.celeryproject.org/en/latest/userguide/routing.html#guide-routing

  6. linux中apt-get使用

    apt-get简介 在Ubuntu系统中,经常要用到apt-get install指令来安装软件,由于常常需要root权限来操作,所以搭配sudo食用口感更佳,apt-get指令对于安装.卸载.升级软 ...

  7. 今天看了《SOFT SKILLS The Software Developer's Life Manual》有感

    从第四篇生产力开始看的,书中提到了专注,待续

  8. HTML&CSS基础-html注释功能

    HTML&CSS基础-html注释功能 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.  一.什么是HTML(Hypertext Markup Language) 超文本标记 ...

  9. 如何自动加载scratch3.0的页面上实现自动加载原有的作品

    首先,我们在安装scratch3.0后,浏览器默认打开的是编程的页面.如下图: 那么我们希望开发一个功能,就是打开的时候默认加入某一个SB3的开发文件 1.首先,我们需要有一个.SB3的开发文件,建议 ...

  10. jupyter notebook中导入其他ipynb文件中的代码

    %%capture %run "../Untitled Folder 3/2nn.ipynb" %%capture 抑制输出%run "../Untitled Folde ...