【剑指Offer for JS】查找二维数组中指定的值

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如:下方的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组中不含有该数字,则返回false。 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 解题 穷举法 最简单粗暴的方式,依次遍历数组中各个元素即可。 function findInMatrixExhaustive(matrix: number[][], target: number): boolean { for (let rowIndex = 0; rowIndex < matrix.length; rowIndex++) { for (let colIndex = 0; colIndex < matrix[rowIndex].length; colIndex++) { const current = matrix[rowIndex][colIndex]; if (current === target) { return true; } } } return false; } 使用现有API进行查找 此种方式可以算是第一种方法的变体,但利用现有API可以一定程度上精简代码 function findInMatrixWithApi(matrix: number[][], target: number): boolean { return matrix.flatMap(item => item).includes(target); } 双索引查找 此种方式在时间复杂度上会优于前2种方式,利用行和列索引的移动来逐步查找目标值。 通过题干给出的信息,我们可以得知行和列都保持有序,挑选矩阵中任一元素(element)与目标值(target)进行对比,会出现以下三种情况: 若element > target,则目标值可能出现的位置一定在element的左侧和上方; 若element < target,则目标值可能出现的位置一定在element的右侧和下方; 若element = target,则说明命中目标值。 target-element.png 通过上面的辅助图我们可以看到target可能出现的地方出现了重叠,那么有没有什么方法对这种情况进行简化呢? 我们尝试把element移动到矩阵的右上角,这时候你会发现,重叠的部分消失了! target-element-no-overlap.png 此时,element与target的关系被简化为以下情况: 若element>target,则target一定出现在element的左侧; 若element= 0) { const current = matrix[row][col]; if (current === target) { return true; } if (current > target) { --col; } else { ++row; } } return false; }

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):