学渣带你刷Leetcode0074搜索二维矩阵  

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:

输入:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 3
输出: true
示例 2:

输入:
matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 13
输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:
 

算法:

 

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

//方法二:一次二分法
//1, 将 m*n 矩阵看做是(m*n - 1)一维的有序数组
//2, Mid 位置对应的数组下标 matrix[Mid / Col][Mid % Col]
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int     iRow        = matrixSize;
    int     iCol        = matrixColSize[0];
    int     iMat_L      = 0;
    int     iMat_R      = iRow * iCol - 1;
    int     iMat_M      = 0;
    int     iMat        = 0;

    if ((NULL == matrix) || (0 == matrixSize)) return false;

    while (iMat_L <= iMat_R)
    {
        iMat_M = (iMat_L + iMat_R) / 2;
        iMat = matrix[iMat_M / iCol][iMat_M % iCol];

        if (iMat == target)
        {
            return true;
        }
        else if (iMat < target)
        {
            iMat_L = iMat_M + 1;
        }
        else 
        {
            iMat_R = iMat_M - 1;
        }
    }

    return false;
}

/*
//方法一:两次二分法
//1,第一次二分法找到行
//2,第二次二分法找到列
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
    int     iRow        = matrixSize;
    int     iCol        = matrixColSize[0];
    int     iRow_L      = 0;
    int     iRow_R      = iRow - 1;
    int     iRow_M      = (iRow_L + iRow_R) / 2;
    int     iCol_L      = 0;
    int     iCol_R      = iCol - 1;
    int     iCol_M      = (iCol_L + iCol_R) / 2;

    if ((NULL == matrix) || (0 == matrixSize)) return false;

    //1,第一次二分法,找到行
    while(iRow_L < iRow_R)
    {
//        printf("[1][RL=%d][RM=%d][RR=%d]\n", iRow_L, iRow_M, iRow_R);
        iRow_M = (iRow_L + iRow_R + 1) / 2;
        if (matrix[iRow_M][0] == target)
        {
            return true;
        }
        else if (matrix[iRow_M][0] < target)
        {
            iRow_L = iRow_M;
        }
        else 
        {
            iRow_R = iRow_M - 1;
        }
    }

    //2,第二次二分法,在 iCol_L 行中找目标值
    while(iCol_L <= iCol_R)
    {
//        printf("[2][CL=%d][CM=%d][CR=%d]\n", iRow_L, iRow_M, iRow_R);
        iCol_M = (iCol_L + iCol_R) / 2;
        if (matrix[iRow_L][iCol_M] == target)
        {
            return true;
        }
        else if (matrix[iRow_L][iCol_M] < target)
        {
            iCol_L = iCol_M + 1;
        }
        else 
        {
            iCol_R = iCol_M - 1;
        }
    }

    return false;
}
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值