Time: 20190918
Type: 数组

题目描述

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

思路

本题应该有三种非常直观的思路。

第一种是非常暴力的O(n2)O(n^2)O(n2)的搜索。

第二种是每行按照二分搜索方式查找,逐行遍历,总共是O(nlogn)O(nlogn)O(nlogn)复杂度的算法。

第三种是对问题的更细粒度的分析。直接上看,二维数组是有序的,如果随便从数组中间选取一个数,该数比target小或者大,都有两种选择。比如说小吧,那么查找方向可以向右或者下,即去找更大的数。

这样一思考,问题好像就变得复杂了。

试着固定变量,从左下角或者右上角来看。

如果是左下角,该值是列值最大,行值最小。如果比target小,则表示本列所有数值都比target小,这一列都不中用,删除本列。

如果比target大,则表示,本行所有数值都比target大,那么本行就不中用,删除本行。

题解

第一种解法:

function Find(target, array)
{// write code hereconsole.log(array.length)m = array.lengthn = array[0].lengthfor(i = 0; i < m; i++) {for(j = 0; j < n; j++) {if (array[i][j] == target) {return true}}}return false;
}
module.exports = {Find : Find
};

第二种解法:

function Find(target, array)
{// write code herefunction binarySearch(arr) {// 行内二分搜索,每行遍历low = 0;high = arr.length - 1;// 循环只做范围缩小while (low + 1 < high) {// low与high相邻时结束mid = Math.floor(low + (high - low) / 2);if (target <= arr[mid]) {high = mid;} else if (target > arr[mid]) {low = mid;}}if (arr[low] == target || arr[high] == target) {return true;} else {return false;}}for (i = 0 ; i < array.length; i++) {res = binarySearch(array[i]);if(res) {return true;}}return false;
}module.exports = {Find : Find
};

第三种解法

function Find(target, array)
{// write code hererow = array.length - 1;col = 0;while (row >= 0 && col <= array[0].length - 1) {if (array[row][col] == target) {return true;}else if (array[row][col] < target) {// 当前列最大值小于target,该列删去col++;} else {// 当前行最小值大于target,向上搜索,该行删去row--;}}return false;
}
module.exports = {Find : Find
};

2019.10 Update:

第一届PAT算法直播课培训班招募帖,欢迎点击查看详情、

END.

【剑指Offer,JS版本】二维数组中的查找相关推荐

  1. 萌萌媛の【剑指offer笔记】二维数组中的查找

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

  2. 【剑指offer题解】二维数组中的查找

    前言 众所周知,对于面试而言,<剑指offer>是一本"好书". 如果你和我一样是个算法菜鸡,那么最推荐的是先把剑指offer的题目搞明白,其次再去刷LeetCode等 ...

  3. 《剑指offer》——04. 二维数组中的查找——暴力法、线性查找——java实现

    文章目录 1.题目描述 2.解决方法 (1)暴力法 (2)线性查找(右上角->左下角) 参考: 1.题目描述 2.解决方法 (1)暴力法 如果不考虑二维数组排好序的特点,则直接遍历整个二维数组的 ...

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

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

  5. 【剑指offer】_01 (二维数组中的查找)

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

  6. 剑指offer (04):二维数组中的查找 (C++ Python 实现)

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

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

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

  8. 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...

  9. [剑指Offer]5.二维数组中的查找

    题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...

  10. 算法题001 剑指Offer 面试题三:二维数组中的查找

    剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...

最新文章

  1. tomcat resin nginx处理MIME类型
  2. SpringBoot+Vue+Itext实现前端请求文件流的方式下载PDF
  3. hdu 4143 A Simple Problem 数论
  4. 基于FPGA的电机控制设计(PWM)
  5. ibatis(0)ibatis 与 mybatis 简述
  6. 营业税计提及企业所得税的相关计算公式
  7. Web服务器的配置与管理(1) IIS的安装与基本设置
  8. jQuery - 按回车键触发跳转
  9. 王思祺2015080360030的第一次作业完全版
  10. php mysql_query 返回值
  11. 视频教程-微信公众号编辑器开发-微信公众号开发11-微信开发php-微信开发
  12. 浩哥的Linux学习笔记之cp命令
  13. html5导航栏向应折叠,超实用!网站导航栏设计形式总结
  14. 类似java制作计算器的游戏_急求一Java编写的类似计算机带的计算器的程序!!...
  15. 微信公众号使用H5获取地理位置信息并定位
  16. Python 函数 | zip 函数详解
  17. 纯C语言实现图片与动画
  18. java_重写hashCode
  19. Java 工程师成神之路 | 2019正式版 1
  20. Ren'Py引擎源代码解读(1)——脚本文件加载

热门文章

  1. 数据结构上机实践第14周项目1(3) - 验证算法(二叉排序树)
  2. oracle授权v$lock,Oracle八大性能视图之v$lock
  3. mysql 追加水印_php 使用GD库为页面增加水印示例代码
  4. matlab中svm testacc参数,使用Matlab进行交叉验证的多类SVM的完整示例
  5. Java图形编程实验总结_实验二java图形界面编程2015级.doc
  6. linux交换内存_Linux中的交换内存如何工作?
  7. 迅捷cad_迅捷泛型
  8. python的系统模块_Python操作系统模块
  9. java 异常处理发生异常_Java中的异常处理
  10. amqp activemq_Spring AMQP ActiveMQ教程(第1部分)