剑指offer——第一题

剑指offer——第一题

第一天】打算以后每天做几道算法题,希望能找到一个好的实习 加油💪

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

背景知识】二位数组中的查找

思路】算法题嘛,先来看看用暴力能不能解决,再去考虑取巧的问题,刚开始还是一步一步来吧!

思路一】暴力法:既然是一个二维数组,那我就去遍历它即可,遍历的时候判断一下是否含有这个整 数,有的话就返回,没有的话就继续,OK,问题迎刃而解,代码如下:

function Find(target, array) {
    for (let row = 0; row < array.length; row++) {
        for (let col = 0; col < array[row].length; col++) {
            if (array[row][col] == target) {
                return true
            }
        }
    }
    return false
}

思路二】找规律:倘若按照思路一的解法,那么题目中的很多话就是废话,现在我们重点就来看那些 被我们忽略掉的话,题目中说每一行都按照从左到右递增的顺序排序,每一列都按照从上到 下递增的顺序排序,我们先自己构建一个这样的数组:​

1  2  3  4  
5  6  7  8
6  7  8  9

我们可以利用此性质,观察数组的左上、左下、右上和右下这样的特殊值,我们会发现右上和左下的这两个值是有利于我们做一些判断的,因为往两个方向的值要么比自己大,要么比自己小,方便做取舍,所以我们优先取这两个值,这里我们就取左下的这个值做说明。

假设我们现在查找的是3这个数,则

  1. 6 > 3 我们往上移动行的值;
  2. 5 > 3 我们往上移动行的值;
  3. 1 < 3 我们往做移动列的值;
  4. 2 < 3 我们往做移动列的值;
  5. 3 = 3 得到目标值

现在我们定义数组的行数为row,列数为col,目标值为target,数组为array,那么数组左下角的数为array[row-1][0],则

  1. array[row-1] [0] > target 另 array[row-1-1] [0]

    1.1 array[row-1-1] [0] < target 另 array[row-1-1] [0+1]

  2. array[row-1] [0] < target 另 array[row-1] [0+1]

    2.1 array[row-1] [0+1] > target 另 array[row-1-1] [0+1]

    具体代码如下:

function Find(target, array) {
   // 定义左下角数组的行的下标
   let row = array.length - 1;
   // 定义左下角数组的列的下标
   let col = 0;
   // 定义数组的列数
   const count = array[0].length;
   // 当检测值行的下标大于等于0且列的下标小于数组总列数时进循环
   while (row >= 0 && col < count) {
       // 当检测值等于目标值时 返回真
       if (array[row][col] == target) {
           return true;
       } else if (array[row][col] > target) {
           //当检测值大于目标值时 检测值往上移动,即行的下标减一
           row--;
       } else {
           //当检测值小于目标值时 检测值往右移动,即列的下标加一
           col++;
       }
   }
   // 退出循环时还未找到目标值返回假
   return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值