题目:
解答:
使用二分查找,首先查找每行首数字,然后确定到行,在该行使用二分查找确定最后元素位置,如果找到则返回true。最终时间复杂度为 O ( lg r o w ) + O ( lg c o l ) O(\lg row) + O(\lg col) O(lgrow)+O(lgcol)
代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int row = matrix.size();
if(row == 0) return false;
int col = matrix[0].size();
if(col == 0) return false;
if(target < matrix[0][0]) return false;
if(target > matrix[row-1][col-1]) return false;
int beginrow = 0, endrow = row;
while(true){
if(beginrow == endrow) return false;
int middle = (beginrow+endrow) / 2;
int val = matrix[middle][0];
if(val == target) return true;
if(val > target){
endrow = middle;
}else{
if(middle == row - 1 || matrix[middle+1][0] > target){
int begincol = 0, endcol = col;
while(true){
if(begincol == endcol) return false;
int middle2 = (begincol+endcol) / 2;
int val2 = matrix[middle][middle2];
if(val2 == target) return true;
if(val2 < target){
begincol = middle2 + 1;
}else{
endcol = middle2;
}
}
}else{
beginrow = middle + 1;
}
}
}
}
};
更新会同步在我的网站更新(https://zergzerg.cn/notes/webnotes/leetcode/index.html)