问题:
编写一个高效算法在m*n的矩阵中查找特定值,这个矩阵具有下列性质:
每一行的整数从左到右有序排列
每一行的第一个整数比上一行的最后一个整数大
例子:
Input: target: 3
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Output: True
解题思路:
1. 可以看出这个矩阵按行排列为有序数组,所以这里我们将它考虑为一个有序的数组,数组长度为矩阵元素的个数。
2. 我们考虑使用二分法,时间复杂度为
O(logn)
实现:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int a = matrix.size();
if (a == 0)
return false;
int b = matrix[0].size();
int m = 0;
int n = a * b - 1;
while (m <= n)
{
int mid = (m + n) / 2;
int value = matrix[mid / b][mid % b];
if (value > target)
{
n = mid -1;
}
else if (value < target)
{
m = mid + 1;
}
else
{
return true;
}
}
return false;
}