剑指offer丨4 二维数组中的查找(JavaScript版本)

题目:JZ4 二维数组中的查找

在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。

数据范围:矩阵的长宽满足0≤n,m≤500 , 矩阵中的值满足0≤val≤10^9
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n+m)O(n+m)

题解1:暴力破解

  • 思路:两次遍历循环该矩阵,查找是否存在target
  • 代码
function Find(target, array)
{
    // write code here
    const n = array.length,
        m = array[0].length;
    for(let i=0;i<n;i++){
        for(let j=0;j<m;j++){
            if(target == array[i][j]){
                return true;
            }
        }
    }
    return false;
}
  • 复杂度分析:
    • 时间复杂度:O(MN)
    • 空间复杂度:O(1)

题解2:线性搜索

  • 思路:利用二位数组行列递增特性
    • 由于行列递增,可以得出:
      • 1.在一列中的某个数字,其上的数字都比它小
      • 2.在一行中的某个数字,其右的数字都比它大
    • 搜索流程:
      • 1.首先从数组左下角搜索.
      • 2.如果当前数字大于target,那么查找往上移一位,如果当前数字小于target,那么查找往右移一位。
      • 3.查找到target,返回true; 如果越界,返回false;
  • 代码:
function Find(target, array) {
  // write code here
  const n = array.length,
    m = array[0].length;
  let row = n - 1,
    col = 0;
  if (m === 0 && n === 0) {
    return false;
  }
  while (row >= 0 && col < m) {
    if (array[row][col] > target) {
      row--;
    }
    else if(array[row][col] < target){
        col++;
    }
    else{
        return true;
    }
  }
  return false;
}
  • 复杂度分析:
    • 时间复杂度:O(M+N)
    • 空间复杂度:O(1)

总结

  • 本题虽然可以用暴力破解解决,但是根除题目的特性还可以使用利用矩阵的特性(线性)进行线性搜索。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值