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;
    }


  • 相关阅读:
    Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
    POJ 1661 Help Jimmy(C)动态规划
    LeetCode第8场双周赛(Java)
    Eclipse访问外部网站(比如:CSDN首页)
    LeetCode第151场周赛(Java)
    LeetCode第152场周赛(Java)
    Eclipse Block Selection(块选择)快捷键 Alt + Shift + A
    PAT(B) 1090 危险品装箱(Java)
    PAT(B) 1050 螺旋矩阵(Java:24分)
    PAT(B) 1045 快速排序(C)
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7019700.html
Copyright © 2011-2022 走看看