二维数组的查找

题目描述:

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路:

思路一:首先想到的是遍历,但很明显,o(n^2)的时间复杂度并不是我们想要的,考虑能否用一个循环解决问题


思路二:重新审题,题目中明确指出二维数组的行、列均是递增,这样一来,一个左上角最小,右下角最大的二维数组就出现在我们面前,如下图所示,并且右边的数总比左边的大,下面的数总比上面的大,可以产生一个简单的思路,如果从数组的某个顶点出发,通过判断数组中的值和目标数的大小关系来移动数组的两个坐标值进行查找,接着就会产生一个很棘手的问题,数组的顶点选择哪个?

[  1    2    8    9

   2    4    9    12

   4    7    10    13

   6    8    11    15    ]

1、首先排除左上角和右下角,因为左上角[1]比右边和下面的都小,[15]比上面和左边的都大,从而无法准确移动数组横纵值

2、考虑右上角和左下角,以右上角为例,比[9]大的数向下找,比[9]小的数向左找,可以依次循环,移动横纵值,左下角同理


基于上述考虑,基本总结出思路:

1、选取右上角或者左下角的元素a[i][j]与target进行比较

2、当target小于元素a[i][j]时,那么target必定在元素a所在行的左边,即j--;

3、当target大于元素a[i][j]时,那么target必定在元素a所在列的下边,即i++;

代码:

有了思路,代码就很容易出来


public class Solution {

    public boolean Find(int target, int [][] array) {

        int row = 0;

        int col = array[0].length - 1;

        while(row=0) {

            if(array[row][col] == target) {

                return true;

            }else if(array[row][col] > target) {

                col--;

            }else if(array[row][col] < target) {

                row++;

            }

        }

        return false;

    }

}

你可能感兴趣的:(二维数组的查找)