为了满足时间复杂度低于O(n+m),观察数据结构,发现该数据结构所构成的矩阵,从左下角的点起,右侧的点大于该点,上方的点小于该点,可以通过逐次移动该点来查找目标点。
这种做法的时间复杂度最大为O(n+m)。具体实现如下,通过引入两个变量来进行越界检测,引入另外两个变量进行游标控制。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.size() == 0 || array.at(0).size() == 0){
            return false;
        }
        int rowCount = 1;
        int colCount = 1;
        int rowCursor = array.size() - 1;
        int colCursor = 0;
        while(true){
            if(array.at(rowCursor).at(colCursor) == target){
                return true;
            }
            if(array.at(rowCursor).at(colCursor) > target){
                rowCount++;
                rowCursor--;
                if(rowCount > array.size()){
                    return false;
                }
            }
            if(array.at(rowCursor).at(colCursor) < target){
                colCount++;
                colCursor++;
                if(colCount > array.at(0).size()){
                    return false;
                }
            }
        }
    }
};


时隔一个月再次刷到这道题,这次思路非常清晰,写下的代码也更加简洁。相较于上面的代码,结构上有不少优化。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        if(array.empty()){
            return false;
        }
        int row = array.size() - 1;
        int col = 0;
        while(col < array.at(0).size() && row >= 0){
            if(target == array.at(row).at(col)){
                return true;
            }
            else if(target > array.at(row).at(col)){
                col++;
            }
            else{
                row--;
            }
        }
        return false;
    }
};