二维数组中的查找——剑指offer04

    科技2025-09-13  28

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

    方法1

    暴力遍历

    var findNumberIn2DArray = function(matrix, target) { var rowLength=matrix.length; if(rowLength==0) return false; var colLength=matrix[0].length; for(var i=0;i<rowLength;i++){ for(var j=0;j<colLength;j++){ if(matrix[i][j]==target) return true; } } return false; };

    方法2

    我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。 从矩阵 matrix 右上角元素(索引设为 (i, j) )开始遍历,并与目标值对比: 当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素; 当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素; 当 matrix[i][j] = target 时,返回 true ,代表找到目标值。 若行索引或列索引越界,则代表矩阵中无目标值,返回 false 。

    如果当前元素大于目标值,说明当前元素的下边的所有元素都一定大于目标值,因此往下查找不可能找到目标值,往左查找可能找到目标值。如果当前元素小于目标值,说明当前元素的左边的所有元素都一定小于目标值,因此往左查找不可能找到目标值,往下查找可能找到目标值。

    var findNumberIn2DArray = function(matrix, target) { if(matrix==null || matrix.length==0 || matrix[0].length==0) return false; var i=0; var j=matrix[0].length-1; while(i<matrix.length && j>=0){ if(matrix[i][j]>target) j--; else if(matrix[i][j]<target) i++; else return true; } return false; };
    Processed: 0.010, SQL: 9