前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]
---------------------
作者:吴潇雄
来源:CSDN
原文:https://blog.csdn.net/weixin_43439741/article/details/83511843
版权声明:本文为博主原创文章,转载请附上博文链接!
---------------------
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入输出分析
每当拿到一个算法题的时候,不要脑子中稍微有点思路后,就开始写代码。而是先把题目中规定的参数搞清楚,然后把参数的例子写出来。
本题两个参数举例:
递增二维数组
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
注意 题目只说每一行是递增的,没有说增幅是多少,不要以为增幅是1。同时也没有说行数和列数相等
要查找的整数
比如:7、5、0、16
对应的输出结果:true、false、false、false
实现思路
暴力遍历法
面试官要的肯定不是这个结果,直接跳过
二分查找法
仔细看这个二维数组最右上角这个数。它所在的行,左面的数字比它小;所在的列,下面的数字比它大:
如果要查询的数字比9大,那么9所在的行就不用在比较了,接下来只需要比较9下面的所有行
如果要查询的数字比9小,那么9所在的列就不用在比较了,接下来只需要比较9左面的所有列
通过这一次的比较,我们就能得到一个新的范围(矩形)。接着继续利用新范围右上角的数字,与要查找的整数进行比较。比较过后,又能得到一个新的进一步缩小的范围(矩形)。如此往复,直到找到目标整数,或者没有找到。
每一次比较的过程,比较类似二分查找
每一步都是通过比较所在行左面数字和所在列下面数字的大小,确定下一步指针的移动方向。
同理,我们还可以从矩形的左下角的数字开始比较
最后,别忘了要把特殊情况考虑进去,比如参数的特殊值
代码实现
function find(target, array) {
let rows = 0; // 右上角数字所在的行
let cols = array[0].length - 1; // 右上角数字所在的列
let result = false;
// 特殊情况判断. 其他特殊情况比如target不在array里,这里不在列举
if(array.length === 0) return false;
while(cols >= 0 && rows < array.length) {
if(array[rows][cols] === target) {
result = true;
break;
} else if(array[rows][cols] > target) {
// 如果右上角数字比目标数字大,向左移动指针
cols--;
} else {
// 如果右上角数字比目标数字小,向下移动指针
rows++;
}
}
return result;
}
前端常见算法面试题之 - 二维数组中的查找[JavaScript解法]的更多相关文章
- 【剑指offer】面试题 4. 二维数组中的查找
面试题 4. 二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...
- 剑指Offer:面试题3——二维数组中的查找(java实现)
问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:取数组中的元素与 ...
- 【剑指Offer学习】【面试题:二维数组中的查找】PHP实现
最近一直看剑指Offer.里面很多算法题.于是就想着用PHP来显示一下. 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的 ...
- 剑指offer-面试题3.二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否有该整数. 算法流程如下: 比如一个 ...
- 剑指offer面试题4: 二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- 剑指offer编程题Java实现——面试题3二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 下面是我实现的代码 ...
- 剑指offer面试题3二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 需要与面试官确认的是,这 ...
- 【剑指Offer】面试题04. 二维数组中的查找
题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: 现 ...
- 《剑指offer》面试题04. 二维数组中的查找
问题描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例: ...
随机推荐
- Cisco HSRP 配置方法(热备份路由协议)配置实例
转裁于51CTO.http://www.mamicode.com/info-detail-862350.html HSRP----热备份路由协议 思科私有协议,与VRRP 虚拟路由协议 相近,(国际标 ...
- Python实例--12306的抢票功能
基础知识学习 目标: 通过python程序实现自动登录下单功能 知识点: Selenium + 云打码 + Python 学习链接: 1. Python学习--Selenium模块 2. Python ...
- 【转】Linux下从TCP状态机,三次握手判断DDOS攻击
从TCP状态机判断DDOS攻击 一.TCP协议 TCP 协议是传送层的核心协议,提供了可靠面向连接的协议,分为三次握手和四次断开,在这个过程中TCP有个状态机,记录不同阶段的状态. 二. TCP握手和 ...
- 关于mybatis反向生成为什么有时候实体类会变成两个
一般来说,将TEXT字段,从一张操作频繁的表中拆分出去,成为一个Key-Value结构的独立表是 好处颇多的. 其有利之处主要体现在下面三个方面: PS:以下的讨论对象均基于Innodb引擎 1. 便 ...
- Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录
Linux的目录下面形如: [root@:vg_adn_tidbCkhsTest:172.31.17.203 /var/lib/mysql]#ll /tmp total drwxr root root ...
- hadoop集群为分布式搭建
1.准备Linux环境设置虚拟机网络 1.0点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改 ...
- MySQL5.7通过压缩包方式安装与配置
首先下载MySQL5.7的压缩包:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 1.解压缩到目标文件夹,解压后有许多文件,介绍一下用 ...
- Netty 聊天小程序
这节讲解基于 Netty 快速实现一个聊天小程序. 一.服务端 1. SimpleChatServerHandler(处理器类) 该类主要实现了接收来自客户端的消息并转发给其他客户端. /** * 服 ...
- 【转】ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 此处手札 供后人参 ...
- Flume学习之路 (三)Flume的配置方式
一.单一代理流配置 1.1 官网介绍 http://flume.apache.org/FlumeUserGuide.html#avro-source 通过一个通道将来源和接收器链接.需要列出源,接收器 ...