一、题目要求

二、重点难点分析
1.为什么我们考虑利用x-y轴来解决问题?(1)每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序,符合数学里的x-y轴(2)便于查找,判断x项和y项是否等于目标数的(x,y)就可以得出答案
2.为什么不能右下角开始?(1)首先右下角的数肯定是最大的,并且在最后一行,最后一行的第一个数肯定比目标数大,为什么?因为这是从左到右递增的,从上到下递增的;如果我们先从y轴开始判断,每行最后一个数都是最大;综上所述,导致目标数不能大于当前位置的数字,就不能逐渐靠近目标数
3.为什么不能左上角开始?(1)左上角的数为该二维数组最小的一个,满足不了判断条件。
4.想到了一个二分法,但是通过不了,我想每行找到中间数和目标数进行比较,如果大,就中间数的位置减一,如果小就跑到下一行进行比较;因为每行中间数的位置是固定的,所以就可以找到目标数,但是如果遇到了二位组里只有行而且长度只有2位,求中间数时,会跑到第零位,导致答案出错
5.从第四个想法改变了一下,为什么不能组成一维数组?所以我就开始跑一维数组,因为是排序的关系,可以用到二分法。
三、代码展示
1.右上角 matrix[matrix.length - 1][0]为坐标轴开始计算
1 /** 2 * @param {number[][]} matrix 3 * @param {number} target 4 * @return {boolean} 5 */ 6 var findNumberIn2DArray = function(matrix, target) { 7 let x = matrix.length -1; 8 let y =0; 9 while( x>=0 && y<=matrix[0].length-1){ 10 if( matrix[x][y] === target) return true; 11 else if( matrix[x][y] > target){ 12 x--; 13 }else{ 14 y++; 15 } 16 } 17 return false; 18 };
2.左下角 matrix[0][matrix[0].length-1] 这个位置建立坐标轴
1 /** 2 * @param {number[][]} matrix 3 * @param {number} target 4 * @return {boolean} 5 */ 6 var findNumberIn2DArray = function(matrix, target) { 7 if(!matrix.length) return 0; 8 // 如果为空输出零 9 let x = 0; 10 let y = matrix[0].length-1; 11 12 while( x<=matrix.length-1 && y>=0) { 13 if( matrix[x][y] === target){ 14 return true; 15 }else if( matrix[x][y] > target){ 16 y--; 17 }else if( matrix[x][y] < target){ 18 x++; 19 } 20 } 21 22 return false; 23 };

3.二分法想法:错误代码
/** * @param {number[][]} matrix * @param {number} target * @return {boolean} */ var findNumberIn2DArray = function(matrix, target) { let left = 0; let right = matrix.length-1; let y =0; let mid = Math.floor((left+right)/2); while( y<=mid){ if( matrix[mid][y] === target){ return true; }else if(matrix[mid][y] > target){ mid = mid-1; }else{ y++;; } } return false; };

4.利用for of的迭代关系,可以把整个二维数组排序成一维数组,利用二分法即可
1 /** 2 * @param {number[][]} matrix 3 * @param {number} target 4 * @return {boolean} 5 */ 6 var findNumberIn2DArray = function(matrix, target) { 7 for( let nums of matrix){ 8 let left =0; 9 let right = nums.length-1; 10 11 while(left<=right){ 12 let mid = Math.floor((left+right)/2); 13 if( nums[mid] === target){ 14 return true; 15 }else if( nums[mid] >target){ 16 right = mid -1; 17 }else{ 18 left = mid +1 19 } 20 } 21 } 22 return false; 23 };

浙公网安备 33010602011771号