刷题-二维数组中的查找

Posted on 2022-02-06 23:56  AcTourist  阅读(81)  评论(0)    收藏  举报

一、题目要求

 

 

二、重点难点分析

  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 };