class Solution {
//binary search at the last column first, find the interested row
//then binary search in this row
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int rowNum = matrix.size();
if(0 == rowNum) return false;
int colNum = matrix[0].size();
//get the row
int l = 0; int r = rowNum-1;
while (l <= r)//find the first first element bigger than target
{
int m = l+(r-l)/2;
if (matrix[m][colNum-1] == target)
return true;
else if (matrix[m][colNum-1] < target)
l = m+1;
else// if ((matrix[m][colNum-1] > target)
r = m-1;
}
int row = l;
if(row < 0 || row >= rowNum) return false;
l = 0; r = colNum-1;
while (l <= r)
{
int m = l+(r-l)/2;
if (matrix[row][m] == target)
return true;
else if (matrix[row][m] < target)
l = m+1;
else// if ((matrix[m][colNum-1] > target)
r = m-1;
}
return false;
}
};
second time
class Solution {
public:
int searchRow(vector<vector<int> > &matrix, int target)
{
int rowNum = matrix.size();
int colNum = matrix[0].size();
int left = 0;
int right = rowNum-1;
while(left <= right)
{
int mid = left+(right-left)/2;
int curNum = matrix[mid][colNum-1];
if(curNum == target) return mid;
else if(curNum > target) right = mid-1;
else left = mid+1;
}
if(left >= 0 && left < rowNum && matrix[left][colNum-1] >= target) return left;
else return false;
}
int searchColumn(vector<vector<int> > &matrix, int rowIdx, int target)
{
int rowNum = matrix.size();
int colNum = matrix[0].size();
int left = 0;
int right = colNum-1;
while(left <= right)
{
int mid = left+(right-left)/2;
int curNum = matrix[rowIdx][mid];
if(curNum == target) return mid;
else if(curNum > target) right = mid-1;
else left = mid+1;
}
return -1;
}
bool searchMatrix(vector<vector<int> > &matrix, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = matrix.size();
if(n == 0) return false;
int m = matrix[0].size();
if(m == 0) return false;
int rowIdx = searchRow(matrix, target);
if(rowIdx == -1) return false;
int columnIdx = searchColumn(matrix, rowIdx, target);
if(columnIdx == -1) return false;
return true;
}
};
本文介绍了一种高效的搜索算法,用于在一个有序的二维矩阵中查找特定的目标值。该算法首先通过二分查找确定目标可能存在的行,然后在该行内再次使用二分查找找到目标值。这种方法的时间复杂度为O(log n),显著提高了搜索效率。
288

被折叠的 条评论
为什么被折叠?



