题解 | #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

相关推荐

一名愚蠢的人类:多少games小鬼留下了羡慕的泪水
投递荣耀等公司10个岗位
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
6 收藏 评论
分享
牛客网
牛客企业服务