这个问题主要在于算法时间
题目描述:
写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3
,返回 true
解决思路:
直接暴力求解的话,复杂度O(m*n)。观察这个题目,题目已经说了两个特性,那么解决思路就来了
解法一:将这个矩阵展开成一维数组,使用二分法搜索
解法二:从左下角开始搜索,目标元素记为target,矩阵中搜索元素记为item,如果target < item,说明目标元素target位置在当前元素item的上方;如果target > item,说明目前元素在当前元素的右方;复杂度为O(m+n),这种方法可以搜索到整个矩阵,怎么理解呢,你在X轴方向走M步,Y轴方向走N步可以保证到达矩阵上所有点。
代码:
class Solution {
public:
/*
* @param matrix: matrix, a list of lists of integers
* @param target: An integer
* @return: a boolean, indicate whether matrix contains target
*/
bool searchMatrix(vector<vector<int>> &matrix, int target) {
// write your code here
if (!matrix.empty())
{
int col, row;
col = matrix.size();
row = matrix[0].size();
int x, y;
x = col - 1; //from the lower left corner
y = 0;
while (true)
{
if (target < matrix[x][y]) --x;
else if (target > matrix[x][y]) ++y;
else
{
return true;
}
if (x < 0 || y >= row) break;
}
}
return false;
}
};
又涨新姿势了,手动滑稽