74. Search a 2D Matrix

二分查找

  • 有个问题就是为什么基于matrix[0] 按照一维数组进行操作,不正确,这个主要原因是因为传入的matrix不是在内存线性连续分布的,而是每个matrix每个的起始地址都是malloc得到的。
    eg

   matrix = calloc(matrixRowSize, sizeof(int *));

for(int i = 0 ; i < matrixRowSize;i++)
      matrix[i]  = calloc(matrixColSize, sizeof(int));

如果这样申请,就可以当做一维数组使用
int (matrix)[matrixColSize] = (int ()[matrixColSize])calloc(matrixRowSize*matrixColSize, sizeof(int));

针对2D matrix的题目,需要熟练理解多维数组和指针的关系
https://www.cnblogs.com/chenyangyao/p/5222696.html
a[1][2] :
a类型:int ()[2]
&a类型:int (
)[1][2] &a+1 = &a +sizeof(a) = &a+ 12sizeof(int)
a[0]类型:int *

&a[0][0] a[0] a 地址一样,类型不一样

bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
    int start = 0;
    int end = matrixRowSize*matrixColSize-1;
    int mid;

    if(matrixRowSize == 0 || matrixColSize ==0)
        return false;
    while(start+1 < end){
        
        mid = start+(end-start)/2;


        //if(matrix[mid/matrixColSize][mid%matrixColSize] == target)
        if(*(*(matrix+mid/matrixColSize)+mid%matrixColSize) == target)
            return true;
        else if(matrix[mid/matrixColSize][mid%matrixColSize] > target)
            end = mid;
        else
            start = mid;
        
    }
    
    if(matrix[start/matrixColSize][start%matrixColSize] == target)
        return true;
    if(matrix[end/matrixColSize][end%matrixColSize] == target)
        return true;
    
    return false;
}

你可能感兴趣的:(74. Search a 2D Matrix)