【算法之旅】2. 二维数组中的查找

344 阅读1分钟

题干

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

 

示例:

现有矩阵 matrix 如下:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

给定 target = 5,返回 true。

给定 target = 20,返回 false。

 

限制:

0 <= n <= 1000

0 <= m <= 1000

解题

解题一、

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var findNumberIn2DArray = function(matrix, target) {
    if(matrix.length === 0) return false

    for(let i = 0;i<matrix.length;i++){
        if(target >= matrix[i][0]){
            for(let j=0;j<matrix[i].length;j++){
                if(target === matrix[i][j]){
                    return true
                    break
                }else{
                    if(i === matrix.length -1 && j=== matrix[i].length -1){
                        return false
                        break
                    }else{
                        continue
                    }
                }
            }
        }else{
            if(i === matrix.length -1){
                return false
            }else{
                continue
            }

        }
    }
};

解题二、

/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var findNumberIn2DArray = function(matrix, target) {
    let i= matrix.length - 1
    let j = 0

    while(i>=0 && j<matrix[0].length){
        if(target < matrix[i][j]){
            i -= 1
        }else if(target > matrix[i][j]){
            j += 1 
        }else{
            return true
        }
    }
    return false

};

假设matrix的宽高为n,m,解法一的时间复杂度为O(nm),解法二的时间复杂度为O(n+m)

可知当n>2且m>2时。解法二的时间复杂度较小