仅供自己学习
思路:
因为题目给出了矩阵的特性,每一行是从左到右递增,每一行的第一个元素都大于前一行的最后一个元素,那么就可以通过第一列的元素和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 };
原文:https://www.cnblogs.com/Mrsdwang/p/14597979.html