Leetcode 74. 搜索二维矩阵 C+

 

二分法,先对行二分找出结果可能存在的行,再对这一行二分查找。O(Log m+Log n),m、n分别为矩阵的高和宽。

 1 class Solution {
 2 public:
 3     bool searchMatrix(vector<vector<int>>& matrix, int target) {
 4         //二分,先找可能存在的行,再在行里二分找数
 5         if(matrix.empty() or matrix[0].empty()){return false;}
 6         int m=matrix.size(),n=matrix[0].size();
 7         int row_le=0,row_ri=m-1,row_mi;
 8         while(row_le<row_ri){
 9             row_mi=row_le+(row_ri-row_le)/2;
10             if(matrix[row_mi][0]>target){
11                 row_ri=row_mi;
12             }
13             else if(matrix[row_mi][n-1]<target){
14                 row_le=row_mi+1;
15             }
16             else{
17                 row_le=row_ri=row_mi;
18             }
19         }
20         int le=0,ri=n-1,mi;
21         while(le<ri){
22             mi=le+(ri-le)/2;
23             if(matrix[row_le][mi]<target){
24                 le=mi+1;
25             }
26             else{
27                 ri=mi;
28             }
29         }
30         return matrix[row_le][le]==target;
31     }
32 };

 

评论区的:O(m+n), m、n分别为矩阵高和宽,更简洁,尽管牺牲了复杂度。

 1 class Solution {
 2 public:
 3     bool searchMatrix(vector<vector<int>>& matrix, int target) 
 4     {
 5         if(matrix.size()==0 or matrix[0].size()==0)
 6         {
 7             return false;
 8         }
 9         int m=matrix.size(),n=matrix[0].size();
10         int row=0,col=n-1;
11         while(row<m and col>=0)
12         {
13             if(matrix[row][col]==target)
14             {
15                 return true;
16             }
17             else if(matrix[row][col]>target)
18             {
19                 --col;
20             }
21             else
22             {
23                 ++row;
24             }
25         }
26         return false;
27     }
28 };

 

posted @ 2019-05-02 02:49  NeoZy  阅读(155)  评论(0编辑  收藏  举报