为了满足时间复杂度低于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;
}
};