74. 搜索二维矩阵

这篇博客介绍了一个高效的C++算法,用于在特定矩阵中判断是否存在目标值。矩阵特点是每行整数升序排列且每行首元素大于前一行末元素。算法通过两次二分查找,首先确定目标值可能所在的行,然后在该行内查找目标值。这种方法在时间和内存效率上表现出色,达到了0ms的执行时间和9.2MB的内存消耗。

编写一个高效的算法来判断 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

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:9.2 MB, 在所有 C++ 提交中击败了80.04%的用户
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        // 那么简化先判断在哪一行
        int line = judgeline(matrix,target);
        cout<<line;
        if(line<0|| line>= matrix.size()) {
            return false;
        }
        return bfind(matrix[line],target);
    }

    int judgeline(vector<vector<int>>& matrix,int target) {
        int begin = 0;
        int end = matrix.size();
        int res;
        int mid;
        while(begin<end) {
            mid = begin+(end-begin)/2;

            if(target==matrix[mid][0]) {
                return mid;
            } else if(target<matrix[mid][0]) {
                end=mid;
            } else {
                begin = mid+1;
                res=mid;
            }
        }

        return res;

    }

    bool bfind(vector<int> matrix,int target) {
        int left = 0;
        int right = matrix.size();
        while(left<right) {
            int mid = left+(right-left)/2;
            if(matrix[mid]==target) {
                return true;
            } else if(matrix[mid]<target) {
                left=mid+1;
            } else {
                right=mid;
            }
        }

        return false;
    }
};

思路

进行两次二分查找,先判断数字再哪一行再判断数字在哪一列

原来二分查找可以用来找到距离target最近的小于target的最大的数,与单调栈不同的是,单调栈原本的序列是无序的,单调栈也可以找到离target最近的最大或最小的数

关键在于记住每一个条件下的mid,这个条件根据需求可能是value<target或者value>target

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值