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]
2.Elimination, 遇到element < target, 则row++;遇到element > target, 则column--
Running Time:
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]
]
1.先对row,再对column进行二分查找
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
if (target < matrix[0][0]) return false;
vector<int> larget_element_vector = matrix[matrix.size()-1];
if (target > larget_element_vector[larget_element_vector.size()-1]) return false;
int row_number = searchMatrixRow(matrix, target, 0, matrix.size()-1);
return searchMatrixInRow(matrix[row_number], target, 0, matrix[row_number].size()-1);
}
private:
int searchMatrixRow(vector<vector<int>>& matrix, int target, int begin, int end) {
int mid = (begin + end) / 2;
if (begin == end)
return begin;
else if (target >= matrix[mid][0] && target < matrix[mid+1][0])
{
return mid;
}
else if (target < matrix[mid][0])
{
return searchMatrixRow(matrix, target, begin, mid - 1);
}
else if (target > matrix[mid][0])
{
return searchMatrixRow(matrix, target, mid + 1, end);
}
}
bool searchMatrixInRow(vector<int> &row, int target, int begin, int end) {
int mid = (begin + end) / 2;
if (begin > end) return false;
if (target > row[mid]) return searchMatrixInRow(row, target, mid+1, end);
else if (target < row[mid]) return searchMatrixInRow(row, target, begin, end - 1);
else return true;
}
};
2.Elimination, 遇到element < target, 则row++;遇到element > target, 则column--
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int row = 0;
int col = matrix[0].size()-1;
int max_row = matrix.size();
while(row < max_row && col >= 0) {
if(matrix[row][col] == target) return true;
else if (matrix[row][col] > target) col--;
else row++;
}
return false;
}
};
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int row = 0;
int col = matrix[0].size()-1;
int max_row = matrix.size();
int column_decreased = false;
while(row < max_row && col >= 0) {
if(matrix[row][col] == target) return true;
else if (matrix[row][col] > target) {
column_decreased = true;
col--;
}
else {
if(column_decreased) return false;
else row++;
}
}
return false;
}
};
Running Time:
方法一:12 ms
方法二: 16 ms
方法三: 12 ms
方法一为log复杂度,方法二为线性复杂, 方法三则有随机算法的成分在,复杂度取决于target取值范围