74. Search a 2D Matrix

仅供自己学习

 

思路:

因为题目给出了矩阵的特性,每一行是从左到右递增,每一行的第一个元素都大于前一行的最后一个元素,那么就可以通过第一列的元素和target进行大小比较,找到第一个大于target的元素的行,然后将这个行记录并减一,就得到target所在的行,那么在对着行进行搜索即可。

代码:

 1 class Solution {
 2 public:
 3     bool searchMatrix(vector<vector<int>>& matrix, int target) {
 4         auto row=upper_bound(matrix.begin(),matrix.end(),target,[](const int b,const vector<int>& a){
 5             return b<a[0];
 6         });
 7         if(row==matrix.begin()) return false;
 8         row--;
 9         return binary_search(row->begin(),row->end(),target);
10 
11     }
12 };

 

还可以将矩阵展开成一维数组,那么通过下标变换就可达到每一个元素。然后再对这个数组进行二分搜索。通过 i*col+j=mid,i为当前元素所在行数,j为当前元素所在列数,然后化为一维数组后的下标为 mid/col 为行,mid%col为列。

代码:

 1 class Solution {
 2 public:
 3     bool searchMatrix(vector<vector<int>>& matrix, int target) {
 4         int row=matrix.size(),col=matrix[0].size();
 5         int left=0,right=row*col-1;
 6         while(left<=right){   
 7             int mid=(right+left)/2;
 8             int x = matrix[mid/col][mid%col];
 9             if(x==target) return true;
10             else if(x>target) right=mid-1;
11             else if(x<target) left = mid +1;
12         }
13         return false;
14     }
15 };

 

posted @ 2021-03-30 17:46  Mrsdwang  阅读(45)  评论(0编辑  收藏  举报