Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target = 3
, return true
.
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int x = matrix.size(), y = matrix[0].size(), n = x * y;
int a = 0, b = n - 1, mid = (a + b) / 2;
int im = mid / y, jm = mid - im * y;
while(a <= b) {
if(matrix[im][jm] == target) return true;
else if(target > matrix[im][jm]) a = mid + 1;
else b = mid - 1;
mid = (a + b) / 2;
im = mid / y;
jm = mid - im * y;
}
return false;
}
};
思路:解法时间复杂度 O(logmn)。只是把一个有序数组折叠成了矩阵,解法还是一样。这里采用乘除法计算下标。
运算速度稍快的解法使用加法计算。
附:使用加法计算下标的方法:
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int x = matrix.size(), y = matrix[0].size(), n = x * y;
int a = 0, b = n - 1, m = (a + b) / 2, t = m;
int im, jm;
while(a <= b) {
m = (a + b) / 2;
t = m;
for(im = 0; im < x; im++) {
for(jm = 0; jm < y; jm++) {
if(t == 0) goto lab1;
t--;
}
}
lab1: if(matrix[im][jm] == target) return true;
else if(target > matrix[im][jm]) a = m + 1;
else b = m - 1;
}
return false;
}
};
注:此处使用了goto来跳出两层循环。事实上如果仅用goto跳出多层循环,不会造成程序混乱。