编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
示例 1:
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true
解题思路:
1. 按照对角线,分别遍历行和列,采用二分法搜索目标数字。
bool FindRow(int** matrix, int colSize, int target, int start)
{
int left = start;
int right = colSize - 1;
while(left <= right) {
int mid = (left + right) / 2;
if (matrix[start][mid] < target) {
left = mid + 1;
} else if (matrix[start][mid] > target) {
right = mid -1;
} else {
return true;
}
}
return false;
}
bool FindColum(int** matrix, int rowSize, int target, int start)
{
int left = start;
int right = rowSize - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (matrix[mid][start] < target) {
left = mid + 1;
} else if (matrix[mid][start] > target) {
right = mid -1;
} else {
return true;
}
}
return false;
}
#define MIN(a, b) (a) > (b) ? (b) : (a)
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
int size = MIN(matrixSize, *matrixColSize);
for (int i = 0; i < size; i++) {
if (FindRow(matrix, *matrixColSize, target, i) ||
FindColum(matrix, matrixSize, target, i)) {
return true;
}
}
return false;
}