1. 題目
編寫一個搜索m*n矩陣中的值的有效算法,該矩陣具有以下性質:
每行中的整數從左到右排序。
每行的第一個整數大於前一行的最後一個整數。
2. 分析
1:給定矩陣是有序的,可以採用兩次二分查找,先找出行,再找出列
2:將該矩陣看成是一個一維數組,數組值爲 matrix[ i / n ][ i % n ]
3. 代碼
1)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if(m <= 0)
return false;
int n = matrix[0].size();
if(n <= 0)
return false;
// 注意先判斷 target 是否處於數組範圍內
if(target < matrix[0][0] || target > matrix[m - 1][n - 1])
return false;
int l = 0;
int r = m - 1;
while(l <= r)
{
int mid = l + ((r - l) >> 1);
// 注意是先用第一列來判斷行數,不要寫成 matrix[mid]
if(target == matrix[mid][0])
return true;
else if(target < matrix[mid][0])
r = mid - 1;
else
l = mid + 1;
}
int ll = 0;
int rr = n - 1;
while(ll <= rr)
{
int lmid = ll + ((rr - ll) >> 1);
// matrix[r][lmid] 不要選錯範圍
if(target == matrix[r][lmid])
return true;
else if(target < matrix[r][lmid])
rr = lmid - 1;
else
ll = lmid + 1;
}
return false;
}
};
2)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size();
if(m <= 0)
return false;
int n = matrix[0].size();
if(n <= 0)
return false;
// 一定不要遺漏這一步
if(target < matrix[0][0] || target > matrix[m - 1][n - 1])
return false;
int left = 0;
int right = m * n - 1;
// 注意 matrix[mid / n][mid % n] 下標不要選錯
while(left <= right)
{
int mid = left + ((right - left) >> 1);
if(target == matrix[mid / n][mid % n])
return true;
else if(target < matrix[mid / n][mid % n])
right = mid - 1;
else
left = mid + 1;
}
return false;
}
};