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 };
进击的小🐴农