【剑指Offer,JS版本】二维数组中的查找
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版本】二维数组中的查找相关推荐
- 萌萌媛の【剑指offer笔记】二维数组中的查找
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- 【剑指offer题解】二维数组中的查找
前言 众所周知,对于面试而言,<剑指offer>是一本"好书". 如果你和我一样是个算法菜鸡,那么最推荐的是先把剑指offer的题目搞明白,其次再去刷LeetCode等 ...
- 《剑指offer》——04. 二维数组中的查找——暴力法、线性查找——java实现
文章目录 1.题目描述 2.解决方法 (1)暴力法 (2)线性查找(右上角->左下角) 参考: 1.题目描述 2.解决方法 (1)暴力法 如果不考虑二维数组排好序的特点,则直接遍历整个二维数组的 ...
- 剑指offer(一):二维数组中的查找
题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 【剑指offer】_01 (二维数组中的查找)
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 剑指offer (04):二维数组中的查找 (C++ Python 实现)
1 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如: ⎡⎣⎢⎢⎢12 ...
- 剑指offer:2.二维数组的查找(Java版)
备注:本文参照<剑指offer第二版> 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数, 输入这样的一个二维数组和一个整数 ...
- 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找
点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...
- [剑指Offer]5.二维数组中的查找
题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...
- 算法题001 剑指Offer 面试题三:二维数组中的查找
剑指Offer题目1:二维数组中的查找 题目描述: http://ac.jobdu.com/problem.php?cid=1039&pid=0 在一个二维数组中,每一行都按照从左到右递增的顺 ...
最新文章
- tomcat resin nginx处理MIME类型
- SpringBoot+Vue+Itext实现前端请求文件流的方式下载PDF
- hdu 4143 A Simple Problem 数论
- 基于FPGA的电机控制设计(PWM)
- ibatis(0)ibatis 与 mybatis 简述
- 营业税计提及企业所得税的相关计算公式
- Web服务器的配置与管理(1) IIS的安装与基本设置
- jQuery - 按回车键触发跳转
- 王思祺2015080360030的第一次作业完全版
- php mysql_query 返回值
- 视频教程-微信公众号编辑器开发-微信公众号开发11-微信开发php-微信开发
- 浩哥的Linux学习笔记之cp命令
- html5导航栏向应折叠,超实用!网站导航栏设计形式总结
- 类似java制作计算器的游戏_急求一Java编写的类似计算机带的计算器的程序!!...
- 微信公众号使用H5获取地理位置信息并定位
- Python 函数 | zip 函数详解
- 纯C语言实现图片与动画
- java_重写hashCode
- Java 工程师成神之路 | 2019正式版 1
- Ren'Py引擎源代码解读(1)——脚本文件加载
热门文章
- 数据结构上机实践第14周项目1(3) - 验证算法(二叉排序树)
- oracle授权v$lock,Oracle八大性能视图之v$lock
- mysql 追加水印_php 使用GD库为页面增加水印示例代码
- matlab中svm testacc参数,使用Matlab进行交叉验证的多类SVM的完整示例
- Java图形编程实验总结_实验二java图形界面编程2015级.doc
- linux交换内存_Linux中的交换内存如何工作?
- 迅捷cad_迅捷泛型
- python的系统模块_Python操作系统模块
- java 异常处理发生异常_Java中的异常处理
- amqp activemq_Spring AMQP ActiveMQ教程(第1部分)