我的思路:
1、在一个排好序的二维数组中找目标数,返回成功或者失败。
2、二分查找,首先在列上找值,定位到哪一行之后,在行内二分查找。复杂度是log(n) + log(m)。
代码如下:
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int n = matrix.size();
int m = matrix[0].size();
int i = 0;
int j = n - 1;
int mid1;
while (i <= j) {
mid1 = (j - i) / 2 + i;
if (target < matrix[mid1][0])
j = mid1 - 1;
else if (target > matrix[mid1][m - 1])
i = mid1 + 1;
else
break;
}
if (mid1 >= 0 && mid1 < n) {
int g = 0;
int h = m - 1;
while (g <= h) {
int mid = (h - g) / 2 + g;
if (matrix[mid1][mid] < target)
g = mid + 1;
else if (matrix[mid1][mid] > target)
h = mid - 1;
else
return true;
}
}
return false;
}
我的思路2:
1、剑指Offer上的第3题就是这个,看了那边的思路之后,自己写了一个,结果比上面的那个运行速度还要快。
代码如下
bool searchMatrix(vector<vector<int> > &matrix, int target) {
int i = 0, j = matrix[0].size() - 1;
while (i < matrix.size() && j > -1) {
if (matrix[i][j] > target)
j--;
else if (matrix[i][j] < target)
i++;
else
return true;
}
return false;
}
别人思路:
1、既然都是有序的,那么将二维数组看作一维的来处理,也会加快速度,而且代码会简洁很多,二维到一维的转换只需要使用除法和取余就可以了。