- 时间:2022-09-03 00:37 编辑: 来源: 阅读:312
- 扫一扫,手机访问
摘要:【剑指Offer for JS】在二维数组中找到指定的值。
<源码分享>
在二维数组中,每行从左到右排序,每列从上到下排序。 请完成一个函数,输入这样一个二维数组和一个整数,判断数组是否能包含整数。 例如,底部的二维数组意味着每行和每列都按升序排序。 如果在这个数组中找到数字7,它将返回true;如果您寻找数字5,因为它不在数组中,您将返回false。 1 8 92 4 9 124 7 10 136 8 11 15最简单也是最残忍的解题方法就是依次遍历数组中的元素。 函数findInMatrixExhaustive(matrix:number[][],target:number):boolean { for(let rowIndex = 0;rowIndex & lt矩阵.长度;rowindex++){ for(let colIndex = 0;colIndex & lt矩阵[rowIndex]。长度;colindex++){ const current = matrix[rowIndex][colIndex];if (current === target) {返回true} } }返回false}使用现有API进行搜索可以看作是第一种方法的变种,但是使用现有API绝对可以简化代码函数finding matrix with API(matrix:number[][],target:number):boolean { return matrix . flat map(item = >;项)。包括(目标);}这种双索引搜索的方法在时间复杂度上优于前两种方法,利用行列索引的移动来逐步找到目标值。 从题目中给出的信息,我们可以知道行和列是按顺序排列的。如果筛选矩阵中的任意一个元素与目标值进行比较,会出现以下三种情况:如果element >: Target,则目标值的可能位置一定在该元素的左上方;如果element < Target,目标值的可能位置必须在元素的右下方;如果element = target,则命中目标值。 通过上面的target-element.png辅助图我们可以看到目标可能重叠的地方,那么有什么办法可以简化这种情况呢?让我们试着把元素移到矩阵的右上角。这时候你会发现重叠的部分消失了!至此,target-element-no-overlap.png将元素和目标的关系简化为:如果element >: Target,则目标必须出现在元素的左侧;如果元素<目标,则目标必须出现在元素下面;如果element=target,则命中目标值。 当我们把上面的方法带入到例子中,会得到如下的过程:target-element-result.png,最后我们匹配了相应的元素,匹配成功。 在匹配过程中,如果行索引超过最大行数或者列索引小于0,则意味着整个矩阵不包含目标元素,匹配失败。 函数findInMatrix(matrix: number[][],target:number):boolean { const rowSize = matrix . length;const columnSize = matrix[0]。长度;if (rowSize === 0) {返回false}设row = 0;设col = columnSize-1;while(row & lt;rowSize & amp& ampcol & gt= 0){ const current = matrix[row][col];if (current === target) {返回true} if(当前& gttarget){-col;} else { ++ row;} }返回false}
![](http://bm.damiseo.cn/15914/www.php-asp.net/dami/0459752001595318765tp1-1.jpg)