【剑指offer】1:二维数组中的查找

题目描述:

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

给定 target = 7,返回 true。

给定 target = 3,返回 false。

解题思路:

方法①:

遇到查找问题,首先就会想到遍历循环,因为是二维数组,所以直接双重for循环,在循环之间我们要先考虑target,array为空等特殊情况。因为返回的情况有两种(true 和 false),所以设置标志位,是一个不错的选择。上代码!(时间复杂度为O(n^2))

代码实现:

(JavaScript实现):

function Find(taget, array) 
{
    if (!target || !array || array.length == 0) {
        return false;
    }
    var flag = false;
    for (var i = 0; i < array.length; i++) {
        for (var j = 0; j < array[0].length; j++) {
            if (target == array[i][j]) {
                flag = true;
            }
        }
    }
    return flag;
}

 

 方法②:

由于该二维数组上到下递增,左到右递增的特殊性,总结规律我们可以发现:应该从矩阵的右上角或者左下角开始查找。

以左下角为例,首先选取左下角的数字,如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则说明该行其他元素都大于要查找的数字,便可以直接略过这一行,直接在上一行中进行寻找;如果该数字小于要查找的数字,说明该列元素都要小于要查找的数字,便可以直接略过这一列,直接在下一列中进行寻找。

这样,每一次比较都可以剔除一行或者一列,进而缩小查找范围,时间复杂度为O(n)。

代码实现:

(JavaScript实现):

function Find(taget, array)
{
    // write code here
    // 先考虑特殊情况
    if (!target || !array || array.length == 0) {
        return false;
    }
     // 从左下角开始考虑,因为该行上面小于它,右面大于它
    var row = array.length;  //行数
    var col = array[0].length; // 列数
    for (var i = row - 1, j = 0; i >= 0 && j < col;) {
        if (array[i][j] == target) {
            return true;               //找到
        }else if (array[i][j] > target) {
            i--;                           //比目标元素大,越过该行
        }else if (array[i][j] < target) {
            j++                          //比目标元素小,越过该列
        }
    }
    return false;
}

 

posted @ 2021-04-17 16:05  zhang十六  阅读(56)  评论(0编辑  收藏  举报