--------------------- 
作者:吴潇雄 
来源: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解法]的更多相关文章

  1. 【剑指offer】面试题 4. 二维数组中的查找

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

  2. 剑指Offer:面试题3——二维数组中的查找(java实现)

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

  3. 【剑指Offer学习】【面试题:二维数组中的查找】PHP实现

    最近一直看剑指Offer.里面很多算法题.于是就想着用PHP来显示一下. 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的 ...

  4. 剑指offer-面试题3.二维数组中的查找

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

  5. 剑指offer面试题4: 二维数组中的查找

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

  6. 剑指offer编程题Java实现——面试题3二维数组中的查找

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

  7. 剑指offer面试题3二维数组中的查找

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

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

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

  9. 《剑指offer》面试题04. 二维数组中的查找

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

随机推荐

  1. python基础学习21----进程

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. 进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://w ...

  2. 题解 P1550 【[USACO08OCT]打井Watering Hole】

    题面(翻译有点问题,最后一句话) 农民John 决定将水引入到他的n(1<=n<=300)个牧场.他准备通过挖若 干井,并在各块田中修筑水道来连通各块田地以供水.在第i 号田中挖一口井需要 ...

  3. 恶意代码技术第一二部分——P201421410029

    学   号:201421410029   中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告   实验四 恶意代码技术   ...

  4. Python高级--闭包与装饰器

    前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能.如权限认证. 一.如何定义闭包 1.闭包就是两个嵌套的函数,外层函数 ...

  5. Node.js实战(十)之EventEmitter

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs. ...

  6. J-Link调试查看变量值总是显示<not in scope> 和<cannot evaluate>问题

    原文:https://blog.csdn.net/gmpy_tiger/article/details/50395719 MDK/Keil 中,J-Link调试查看变量值总是显示<not in ...

  7. OpenCV——图像的载入、显示、输出到文件和滑动条、鼠标操作

    图像的载入.显示.输出到文件和滑动条 滑动条 示例: 鼠标操作

  8. css实现气泡框效果

    前提:气泡框或者提示框是网页很常见的,实现它的方式有很多,我们以前最常用的就是切图片 然后通过 "定位" 方式 定位到相应的位置,但是用这种方式维护很麻烦,比如设计师想改成另外一种 ...

  9. HDU1599(Floyd最小环)

    Floyd最小环理解+模板: https://www.cnblogs.com/DF-yimeng/p/8858184.html 除了上述博文里写的,我再补充几点我的理解. 1.为什么先枚举ij求经过i ...

  10. 使用Tortoise结合Git比较两个版本的差异

    1.右键项目,TortoiseGit -------> Diff with previous version 2.单击出分支选择弹窗,进行选择要比较的两个分支 3.比较同个分支的两个不同的版本 ...