《leetCode》:Search a 2D Matrix

本文介绍了一种高效的矩阵搜索算法,该算法能在排序矩阵中快速查找指定数值。通过两种方法对比,一种是直接遍历搜索,另一种则充分利用了矩阵的排序特性进行二分查找,实现了更优的时间复杂度。

题目

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.
For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
Given target = 3, return true.

思路:直接遍历搜索法

直接遍历搜索,实现代码比较简单

bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
    if(matrix==NULL||matrixRowSize<1||matrixColSize<1){
        return false;
    }
    if(target<matrix[0][0]||target>matrix[matrixRowSize-1][matrixColSize-1]){
        return false;
    }
    for(int i=0;i<matrixRowSize;i++){
        for(int j=0;j<matrixColSize;j++){
            if(matrix[i][j]==target){
                return true;
            }
        }
    }
    return false;
}

AC结果如下:Runtime 4ms

思路二

思路一采用的是直接遍历的方法来寻找,没有利用到本题中矩阵本身由的一些性质,性质如下:

Integers in each row are sorted from left to right.//即每行从左到右时排序的
The first integer of each row is greater than the last integer of the previous row.//下一行的第一个数大于上一行的最后一个数

利用这两点的思路为:
先找到target所在的那一行,然后去找到那一列,都是用二分查找法来寻找。

实现代码如下:

bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target) {
    if(matrix==NULL||matrixRowSize<1||matrixColSize<1){
        return false;
    }
    if(target<matrix[0][0]||target>matrix[matrixRowSize-1][matrixColSize-1]){
        return false;
    }
    int beginRow=0;
    int beginCol=0;
    int endRow=matrixRowSize-1;
    int endCol=matrixColSize-1;
    while(beginRow<endRow){
        int midRow=beginRow+(endRow-beginRow)/2;
        int midCol=beginCol+(endCol-beginCol)/2;
        if(matrix[midRow][midCol]==target){
            return true;
        }
        else if(matrix[midRow][midCol]>target){
            if(matrix[midRow][0]>target){
                endRow=midRow-1;
            }
            else{
                beginRow=midRow;
                endRow=midRow;
            }

        }
        else{//matrix[midRow][midCol]<target
            if(matrix[midRow][endCol]<target){
                beginRow=midRow+1;
            }
            else{
                beginRow=midRow;
                endRow=midRow;
            }
        }
    }
    while(beginCol<=endCol){
        int midCol=beginCol+(endCol-beginCol)/2;
        if(matrix[beginRow][midCol]==target){
            return true;
        }
        else if(matrix[beginRow][midCol]>target){
            endCol=midCol-1;
        }
        else {
            beginCol=midCol+1;
        }
    }
    return false;
}

虽然利用了上面的性质,从理论上面来看,时间复杂度为O(log(m*n)),但是,从AC结果来看,Runtime 仍然是4ms,没有什么变化,。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值