白菜刷LeetCode记-240.Search a 2D Matrix II
今天是一道中等题目,题目如下:
第一种想到的办法是遍历每一行,每一行使用二分查找的方法进行搜索,代码如下:
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var searchMatrix = function(matrix, target) { let m = matrix.length; let n = m > 0 ? matrix[0].length:0; if( n <= 0 ) return false; for(let i = 0 ; i < m ; i++){ let lp = 0, rp = n - 1; while(lp <= rp){ let mid = parseInt((lp+rp)/2); if(target < matrix[i][mid]){ rp = mid - 1; } if(target > matrix[i][mid]){ lp = mid + 1; } if(target == matrix[i][mid]){ return true; } } } return false; };
但是是否有更加快速的方法呢,上网被启发了一下,从矩阵的右上角开始搜索,如果目标值比当前行最右边的大,那么就 i ++ , 否则就 j-- , 代码如下:
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var searchMatrix = function(matrix, target) { let m = matrix.length; let n = m > 0 ? matrix[0].length:0; let i = 0 , j = n - 1; if( n <= 0 ) return false; while( i < m && j >= 0 ){ let tmp = matrix[i][j]; if( tmp == target ){ return true; }else if( tmp > target ){ j--; }else{ i++; } } return false; };
END