Leetcode Search a 2D Matrix II

**题目:**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 in ascending from left to right. Integers in each column are sorted in ascending from top to bottom.

思路:题目提供一个二维数组,这个数组的每一行是递增的,每一列是递增的,题目提供一个元素,要求你在这个二维数组中寻找某个元素,如果这个元素在这个数组内,则返回True,否则返回False.
在一个二维数组中寻找某个数,看看它是否存在这个二维数组中,可以选择O(n^2)的查找,找到就返回True。但是这样就会超时。所以就必须选择一种更快速的方式,考虑数组的一个特点,每行是递增的,每列是递增的。在一个有序的数组中查找一个数,不就可以采用二分查找吗?这样就将一个一维数组中查找元素的复杂度从O(n)变为O(logn)了,那么在这一题中同样可以采用这种方法。假设我判断出,这个元素可能在某一行中,那么在这一行中就可以采用O(logn)的查找方法。那么现在的问题就是如何判断,这个元素存在哪一行呢?既然对于某一列可以采用二分查找,那么在判断是否存在某一行的时候也可以采用二分查找呢?因为每一行都是单独递增的,但是仔细想想还是不对啊,某一行的最后一列的元素大小和它下一行的第一个元素大小是不确定的。既然不可以,那我就O(n)线性查找看看所找的目标看看是不是在这一行的范围内,如果在,那么再O(logn)查找。最后时间复杂度就变成O(nlogn)。代码如下所示

    bool searchMatrix(vector<vector<int>>& matrix, int target) 
    {
        int m=matrix.size();
        if(m==0)
        return 0;
        int n=matrix[0].size();
        for(int i=0;i<m;i++)
        {
            if(target<=matrix[i][n-1]&&target>=matrix[i][0])
            {
                int left=0;
                int right=n-1;
                int mid=0;
                if(target==matrix[i][n-1]||target==matrix[i][0])
                return 1;
                while(left<=right)
                {
                    mid=(left+right)/2;
                    if(matrix[i][mid]==target)
                    return 1;
                    else if(matrix[i][mid]<target)
                    {
                        left=mid+1;
                    }
                    else
                    right=mid-1;
                }
            }
        }
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值