查找搜索二维矩阵

搜索二维矩阵(leetcode)

leetcode链接搜索二维矩阵
##题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

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

示例 1:
在这里插入图片描述

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
在这里插入图片描述

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

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

其实就是一个有序的二维数组,然后查找是否有某一个数。

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target){
       int m = matrixSize, n = matrixColSize[0],i=0,j;
        if(m==1&&n==1)
        return matrix[0][0]==target;
        while( i!=m && matrix[i][n-1]<target)
        {
            i++;
        }
        if(i==m)
        return false;
         j=0;
        while(j<n)
        {
            if(matrix[i][j]==target)
            return true;
            j++;
        }

普通的算法其实很简单,但有一个很坑人的地方在leetcode上面提交会出现问题。

while( i!=m && matrix[i][n-1]<target)

这句话不能写成

while(matrix[i][n-1]<target && i!=m)

今天做题的时候被坑了好久。初看其实没什么问题,但仔细琢磨就会发现如果target比数组中的任何一个数都大的话,那么最后一次while循环后i=m再次进行while循环条件的判定如果先判断

matrix[i][n-1]<target

就会出现错误,因为matrix[i][]并不存在。所以就会报错。
这个错误在编译器上可能 并不会报错,但这个细节确实需要掌握,因为很细节哈哈。

leetcode上的进阶操作解题方法

两次二分查找

int binarySearchFirstColumn(int** matrix, int matrixSize, int target) {
    int low = -1, high = matrixSize - 1;
    while (low < high) {
        int mid = (high - low + 1) / 2 + low;
        if (matrix[mid][0] <= target) {
            low = mid;
        } else {
            high = mid - 1;
        }
    }
    return low;
}

bool binarySearchRow(int* row, int rowSize, int target) {
    int low = 0, high = rowSize - 1;
    while (low <= high) {
        int mid = (high - low) / 2 + low;
        if (row[mid] == target) {
            return true;
        } else if (row[mid] > target) {
            high = mid - 1;
        } else {
            low = mid + 1;
        }
    }
    return false;
}

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
    int rowIndex = binarySearchFirstColumn(matrix, matrixSize, target);
    if (rowIndex < 0) {
        return false;
    }
    return binarySearchRow(matrix[rowIndex], matrixColSize[rowIndex], target);
}

一次二分查找

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
    int m = matrixSize, n = matrixColSize[0];
    int low = 0, high = m * n - 1;
    while (low <= high) {
        int mid = (high - low) / 2 + low;
        int x = matrix[mid / n][mid % n];
        if (x < target) {
            low = mid + 1;
        } else if (x > target) {
            high = mid - 1;
        } else {
            return true;
        }
    }
    return false;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值