题目描述
编写一个高效的算法来判断 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;
}
*/