Skip to content

LeetCode-面试题04-二维数组中的查找

题目

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

示例:

现有矩阵 matrix 如下:
[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

给定 target = 5,返回 true。
给定 target = 20,返回 false。

限制:
0 <= n <= 1000
0 <= m <= 1000

解题思路1

这个问题本身有一定的规律,从左到右数字是递增的,从上到下数字也是递增的。可以从第一行的最大数开始与目标数target比较,如果第一行的最大数比target大的话,这一列就可以排除不是要找的位置了,因为第一行也是一列的最小数,只有当target比第一行某一列大的时候,才需要往下面找,找到一个数之后,target的位置可能是向左或者向下的,但不可能向右了,因为右边已经被排除。整个过程一直重复下去就能找到目标数,没有就返回false

解题思路2

每行是从左往右递增有序的,所以只需要对每行进行二分查找,也能快速得到结果

Java代码

java
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        boolean falg = false;
        if (matrix == null || matrix.length == 0) {
            return falg;
        }
        int collen = matrix[0].length - 1;
        int rowlen = 0;
        while (rowlen < matrix.length && collen >= 0) {
            if (target < matrix[rowlen][collen]) {
                collen--;
            } else if (target == matrix[rowlen][collen]) {
                falg = true;
                break;
            } else if (target > matrix[rowlen][collen]) {
                rowlen++;
            }
        }
        return falg;
    }
}

Python代码

python
class Solution(object):
    def findNumberIn2DArray(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        falg = False
        if (matrix==None or len(matrix) == 0):
            return falg
        collen = len(matrix[0]) - 1
        rowlen = 0
        while (rowlen < len(matrix) and collen >= 0):
            if target < matrix[rowlen][collen]:
                collen -= 1
            elif target == matrix[rowlen][collen]:
                falg = True
                break
            elif target > matrix[rowlen][collen]:
                rowlen += 1
        return falg

Java代码2

java
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix==null||matrix.length==0||matrix[0].length==0){
            return false;
        }
        for(int[] i : matrix){
            int find = search(i,target);
            if(find>=0){
                return true;
            }
        }
        return false;
    }

    public int search(int[] rowMat,int target){
        int left = 0;
        int right = rowMat.length-1;
        while(left<=right){
            int mid = left+(right-left)/2;
            if(rowMat[mid]<target){
                left = mid+1;
            } else if (rowMat[mid]>target){
                right = mid-1;
            } else {
                return 1;
            }
        }
        return -1;
    }
}