题目:
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
.
思路:二分法。将2D矩阵拉伸成一维数组去理解,上限和下限即为一维数组中的index. 具体判断的时候转换成二维矩阵中的元素即可。
class Solution {
public:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
if (matrix.size() <= 0) return false;
int row = (int)matrix.size();
int col = (int)matrix[0].size();
int lower_bound = 0;
int upper_bound = row * col - 1;
while (lower_bound <= upper_bound) {
int mid = (lower_bound + upper_bound) / 2;
if (matrix[mid/col][mid%col] == target) return true;
else if (matrix[mid/col][mid%col] < target) lower_bound = mid + 1;
else upper_bound = mid - 1;
}
return false;
}
};
总结:复杂度为O(logmn).