Description
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
1.Integers in each row are sorted from left to right.
2.The first integer of each row is greater than the last integer of the previous row.
Example 1
Input:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
Output: true
Example 2
Input:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
Output: false
Solution 1(C++)
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (!matrix.size())
return false;
if (!matrix[0].size())
return false;
int m = matrix[0].size();
int l = 0;
int r = m * matrix.size() - 1;
while (l < r) {
int mid = (l + r)/2;
if (matrix[mid/m][mid % m] < target) {
l = mid + 1;
} else {
r = mid;
}
}
return matrix[r/m][r%m] == target;
}
};
算法分析
将二维矩阵看做一个一维矩阵即可,然后找到转换公式即可。但问题的关键还是二分搜索的算法。详情参考:Algorithm-Binary Search算法。
程序分析
略。