[leetcode] 240 Search a 2D Matrix II

很经典的一道题,每行由左到右,每列由上到下升序排列,让我们采用高效的算法判断一个值是不是存在。
第一种方案:遍历行,若发现行首的元素<=target<=行尾的元素,则对该行进行二分查找。

这个算法的最坏时间复杂度是O(n*logm)。当然如果你对行也进行二分搜索,确定一个搜索的行的范围的话,时间复杂度会更低。

class Solution {
public:
    bool searchMatrix(vector<vector<int> >& matrix, int target) {
    	int n=matrix.size(),m=matrix[0].size();
    	for(int i=0;i<n;i++)
    	{
	    	if(matrix[i][0]<=target&&matrix[i][m-1]>=target)
	    	{
    		    int left=0,right=m-1;
    		    while(left<=right)
    		    {
    		    	int mid=(left+right)/2;
    		    	if(matrix[i][mid]==target)
    		    	return true;
    		    	else if(matrix[i][mid]>target)
    		    	right=mid-1;
    		    	else
    		    	left=mid+1;
    		    }
	    	}
	    }
	    return false;
    }
};
第二种方案:很巧妙的一个答案,我也是看了网上的题解才发现这种精巧的算法。算法主要是根据矩阵的特点得来的,如果我们从矩阵的右上角开始,如果target>cur时,那么行数当前行排除,行数+1;如果target<cur时,那么当前列排除,列数-1.遇到边界则结束,返回false;
这样的时间复杂度是O(n+m)。要优于第一种算法。

class Solution {
public:
    bool searchMatrix(vector<vector<int> >& matrix, int target) {
       int n=matrix.size(),m=matrix[0].size();
       int i=0,j=m-1;
	   while(i<n&&j>=0)
	   {
   	       if(matrix[i][j]==target)
			  	return true;
	  	   else if(matrix[i][j]<target)
	  	   i++;
	  	   else
	  	   j--;
       }  
	   return false; 
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值