二维数组中的查找(剑指Offer-04)

题面

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

示例

现有矩阵 matrix 如下:

1[
2   [1,   4,  7, 11, 15],
3   [2,   5,  8, 12, 19],
4   [3,   6,  9, 16, 22],
5   [10, 13, 14, 17, 24],
6   [18, 21, 23, 26, 30]
7]

给定 target = 5,返回 true。

给定 target = 20,返回 false。

限制

10 <= n <= 1000
20 <= m <= 1000

思路

从右上至左下找(或左下至右上),每次都能使查找范围减少一行或一列。时间复杂度O(n+m)。

代码

 1class Solution {
 2public:
 3    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
 4        int n = matrix.size();
 5        if(n<=0) return false;
 6        int m = matrix[0].size();
 7        if(m<=0) return false;
 8
 9        int i=0, j=m-1;
10        while(i<n && j>=0) {
11            if(matrix[i][j] < target)
12                i++;
13            else if(matrix[i][j] > target)
14                j--;
15            else
16                return true;
17        }
18        return false;
19    }
20};