题解 | #18.二维数组中的查找#

二维数组中的查找

http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

题解是抄的,为了我之后更方便找而已

题目所提供的矩阵,是一种特殊的矩阵,称作杨氏矩阵,其有特定的查找算法,时间复杂度 m,n分别为矩阵的两个维度。查找算法步骤如下:

1.从矩阵的左下角或者矩阵的右上角处开始递归运行,以左下角为例,value为要查找的值,(i,j)为当前矩阵中的位置,初始为(M-1, 0)

2.如果超过了矩阵范围则说明不存在这样的元素,返回false

3.否则的话,如果当前位置的值大于value,说明要移动位置(向上移一行),使得数值减小,即递归使得i=i-1;如果当前位置的值小于value,说明要移动位置(向右移一列),使得数值增大,即递归使得j=j+1;如果刚好等于value,返回当前的位置true即可

alt

查找过程如红色箭头所示:

我们在6的位置,发现6比12小,那么6上面的数比6小,右边的数比6大,那么只能向右边走

同理在8,11,一样

当移动到了15,15比12大,那么12一定在15的上方,向上移动

同理在13一样,最后在12处找到了目标值。

function Find(target, array)
{
  //判断数组是否为空
  let m = array.length;
  if(m == 0)  return false;
  
  let n = array[0].length;
  if(n == 0)  return false;
  
  let i=0, j=n-1;//右上角元素
  while(i<m && j>=0){
    if(target < array[i][j]){
      j--;
    }else if(target > array[i][j]){
      i++;
    }else{
      return true;
    }
  }
  return false;
}
module.exports = {
    Find : Find
};
全部评论
时间复杂度O(m+n) 解题思路:利用二维数组行列递增特性 主要思路: 由于行列递增,可以得出: a.在一列中的某个数字,其上的数字都比它小 b.在一行中的某个数字,其右的数字都比它大 搜索流程: a.首先从数组左下角搜索. b.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。 c.查找到target,返回true; 如果越界,返回false; ​ function Find(target, array) { let r = array.length; // 行 if (r == 0) return false; let l = array[0].length; // 列 if (l == 0) return false; let left = 0, bottom = r - 1; // 左下角 while (left < l && bottom >= 0) { let temp = array[bottom][left]; if (temp == target) return true; else if (temp < target) left++; else bottom--; } return false; } module.exports = { Find : Find };
点赞 回复 分享
发布于 2022-07-19 02:58

相关推荐

10-30 19:23
已编辑
山东大学(威海) C++
牛至超人:我了个雷 1.实习经历写太长了吧,精简一点,你写那么老多,面试官看着都烦 2.项目经历你放俩竞赛干啥单独拿出来写上几等奖就行了呗 3.一大雷点就是项目经历里的那个课程设计,大家都知道课程设计巨水,不要写课程设计,换一个名字,就叫学生管理系统,面试官问就说是自己做的项目,不要提课程设计的事 4.那个交流经历,简化一下塞到最上面的教育经历里就行了 5.简历尽量一页纸
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务