Description
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
.
Solution
我们可以把一个这个矩阵看成一维的数组,然后使用二分法进行快速查找就好。
首先我们先得到矩阵(vector< vector< int>>
)的长宽(m, n)。
然后我们就可以对矩阵进行二分查找了,先进行基本的null
判断,然后进行通过长宽求出这个矩阵元素的个数(m * n - 1
),再求出出最中间的元素的序号。
然后就是进行循环,在循环开始之前,我们首先记录下开头(low
)和结尾(high
)的序号,然后进行对中间值的取值并且判断,如果判断相等,则返回true
,如果判断中间的值比target
要小,就要往大的一半去找,所以要把low
赋值为mid + 1
(mid
为中间的序号)。一直做这个循环,直到最后low
比high
要大或者找到了target
返回了值并且跳出了循环。
Source Code
submission
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty()) {
return false;
}
int m = matrix.size();
int n = matrix[0].size();
int low = 0;
int high = m * n - 1;
int mid = (low + high) / 2;
while (low <= high)
{
mid = (low + high) / 2;
int num = matrix[mid / n][mid % n];
if (num == target)
{
return true;
}
else if (num < target)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return false;
}
};
Thinking
这个题目就是考验我们将复杂的问题转化成简单的已知问题的能力。进行搜索的话应该首先想到二分,而且题目的条件也很符合二分查找,通过对矩阵进行简单的变换,我们就能解出这道题目。