【
编写一个高效的算法来搜索 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
示例 2:
输入: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 = 20
输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
又是一个特殊的矩阵题,不用方向数组,也不用DFS。
看到有序,想到二分,本来的想法是先行来次二分,然后列再来次二分,还是很复杂,二分到最接近的数实现起来不怎么熟练。
但这道题还有更简单的方法,注意到左下角,它是第一行的最大元素,同时也是最后一列的最小元素,那么是不是从它开始搜索会比较好呢?
int x;
int y;
int m;
int n;
int GetFlag() {
if ((x > m) || (x < 0) || (y > n) || (y < 0)) {
return 0;
} else {
return 1;
}
}
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
int i;
m = matrixSize - 1; // m 为行坐标,从0开始
n = *matrixColSize - 1; // n为列坐标,从0开始
x = m; // 这里的初始化是重点,从左下角开始搜索
y = 0;
// 正常边界处理,matrix[m][n] 在所有节点中最大,matrix[0][0]最小
if ((target > matrix[m][n]) || (target < matrix[0][0])) {
return false;
}
while (GetFlag()) { // 不出界的情况,一直搜索下去,
if (target > matrix[x][y]) { // target大的话,列坐标加1
y++;
} else if (target < matrix[x][y]) { // target小的话,行坐标减1
x--;
} else if (target == matrix[x][y]) {
return true;
}
}
return false;
}