zoukankan      html  css  js  c++  java
  • [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; 
        }
    };


  • 相关阅读:
    hdu-5569 matrix(dp)
    hdu-5780 gcd(数学)
    hdu-5778 abs(暴力枚举)
    hdu-5777 domino(贪心)
    hdu-5776 sum(同余)
    polymer-quick tour of polymer
    polymer-developer guide-feature overview
    polymer技巧
    polymer入门例子-已过时
    polymer-developer guide-registration and lifecycle
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7223941.html
Copyright © 2011-2022 走看看