LeetCode 74 Search a 2D Matrix
思路
-
通过每一行的头和尾来确定搜索范围(低效)
-
整个二维数组转为一维数组后,是递增的,因此,使用带索引转换的二分查找即可。对于一个 m * n的二维数组,第i行第j列对应一维数组的 i * m + j。因此,若已知一维数组的索引是x,那么对应的二维数组位置是 x / m 行 x % m 列。
代码
低效方法
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty() || matrix[0].empty()) return false;
int m = matrix.size(), n = matrix[0].size();
for (int i = 0; i < m; ++i) {
if (target < matrix[i].front()) break;
if (target <= matrix[i].back())
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == target)
return true;
else if (matrix[i][j] > target) break;
}
}
return false;
}
};
索引转换
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (matrix.empty() || matrix[0].empty()) return false;
int m = matrix.size(), n = matrix[0].size();
int left = 0, right = m * n;
while (left < right) {
int mid = left + (right - left) / 2;
if (matrix[mid / n][mid % n] < target) left = mid + 1;
else right = mid;
}
if (left == m*n) return false;
return matrix[left/n][left%n] == target;
}
};