zoukankan      html  css  js  c++  java
  • LeetCode 74: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.

    Subscribe to see which companies asked this question

    方法一:

    1.先在全部行中利用二分查找target所在行;

    2.然后target所在行进行二分查找target

     class Solution {
     public:
    	 bool searchMatrix(vector<vector<int>>& matrix, int target) {
    		 if (matrix.size() == 0)     return false;
    		 if (matrix[0][0] > target)  return false;
    		 int r = matrix.size(), c = matrix[0].size(); //r,c分别为矩阵matrix的行数和列数
    		 int low = 0, high = r-1;
    
    		 //在全部行中利用二分查找target所在的行
    		while(low <= high)
    		 {
    			 int mid = low + (high-low) / 2;
    			 if (matrix[mid][0] == target)
    				 return true;
    			 else if (matrix[mid][0] < target)
    				 low = mid + 1;
    			 else
    				 high = mid - 1;
    		 }
    
    		//在target所在行中利用二分查找target
    		int low1 = 0, high1 = c - 1;
    		int k = 0;
    		while (low1 <= high1)
    		{
    			int mid1 = low1 + (high1 - low1)/2;
    			if (matrix[low-1][mid1] == target) //注意target所在的行是(low-1)
    				return true;
    			else if (matrix[low-1][mid1] < target)
    				low1 = mid1 + 1;
    			else
    				high1 = mid1 - 1;
    
    			k = mid1;
    		}
    		
    		if (matrix[low-1][k] == target) 
    			return true;
    		else
    			return false;
    	 }
     };


    方法二:将矩阵看成数组,利用二分查找。执行时间12ms,时间复杂度O(log(mn)),将m*n的矩阵看成数组,即matrix[x][y]=>a[x*n+y]。数组也能够转回m*n矩阵。即a[x]=>matrix[x/n][x%n]

    注:此方法为參考leetcode solution中的C++ 12ms方法

    //方法二:
     //将矩阵看成数组,利用二分查找,执行时间12ms,时间复杂度O(log(mn))
     //将m*n的矩阵看成数组,即matrix[x][y]=>a[x*n+y]
     //数组也能够转回m*n矩阵。即a[x]=>matrix[x/n][x%n]
     class Solution {
     public:
    	 bool searchMatrix(vector<vector<int>>& matrix, int target) {
    		 if (matrix.empty())  return false;
    		 int m = matrix.size(), n = matrix[0].size();
    		 int low = 0, high = m*n - 1;
    
    		 while (low<=high)
    		 {
    			 int mid = low + (high - low) / 2;
    			 int value = matrix[mid / n][mid%n];
    			 if (value == target)
    				 return true;
    			 else if (value < target)
    				 low = mid + 1;
    			 else
    				 high = mid - 1;
    		 }
    		 return false;
    	 }
     };
    


    測试代码:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
     class Solution {
     public:
    	 bool searchMatrix(vector<vector<int>>& matrix, int target) {
    		 if (matrix.size() == 0)     return false;
    		 if (matrix[0][0] > target)  return false;
    		 int r = matrix.size(), c = matrix[0].size(); //r,c分别为矩阵matrix的行数和列数
    		 int low = 0, high = r-1;
    
    		 //在全部行中利用二分查找target所在的行
    		while(low <= high)
    		 {
    			 int mid = low + (high-low) / 2;
    			 if (matrix[mid][0] == target)
    				 return true;
    			 else if (matrix[mid][0] < target)
    				 low = mid + 1;
    			 else
    				 high = mid - 1;
    		 }
    
    		//在target所在行中利用二分查找target
    		int low1 = 0, high1 = c - 1;
    		int k = 0;
    		while (low1 <= high1)
    		{
    			int mid1 = low1 + (high1 - low1)/2;
    			if (matrix[low-1][mid1] == target) //注意target所在的行是(low-1)
    				return true;
    			else if (matrix[low-1][mid1] < target)
    				low1 = mid1 + 1;
    			else
    				high1 = mid1 - 1;
    
    			k = mid1;
    		}
    		
    		if (matrix[low-1][k] == target) 
    			return true;
    		else
    			return false;
    	 }
     };
    
    
    int main()
    {
    	Solution s;
    	vector<vector<int>> nums1 = { { 1, 3, 5, 7 }, { 10, 11, 16, 20 }, {23,30,34,50} };
    	bool  t = s.searchMatrix(nums1, 11);
    	cout << t <<endl;
    	system("pause");
    	return 0;
    }


  • 相关阅读:
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月16日)
    优步UBER司机全国各地奖励政策汇总 (2月15日-2月21日)
    优步UBER司机全国各地奖励政策汇总 (2月8日-2月14日)
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(2月7日~2月13日)
    成都Uber优步司机奖励政策(2月7日)
    file does not exist 阿里云OSS图片上传遇到的问题
    redis.conf 配置项说明
    redis 五大数据类型的常用指令
    redis配置外部访问
    linux安装redis
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7019700.html
Copyright © 2011-2022 走看看