【C语言刷LeetCode】240. 搜索二维矩阵 II(M)

编写一个高效的算法来搜索 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值