1、直接循环(超出时间限制)
时间复杂度:O(mn):m、n分别为矩阵的行数、列数,mn即为矩阵元素个数
空间复杂度:O(1)
bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty()) return false; //用m保存矩阵的行数,用n保存矩阵的列数 int m=matrix.size(); int n=matrix[0].size(); for(int i=0;i<m;i++) for(int j=0;j<n;j++){ if(matrix[i][j]==target) return true; } return false; }
2、循环加二分(超时)
时间复杂度:O(mlog n):m、n分别为矩阵的行数、列数
空间复杂度:O(1)
1 bool searchMatrix(vector<vector<int>>& matrix, int target) { 2 if(matrix.empty()) 3 return false; 4 //用m保存矩阵的行数,用n保存矩阵的列数 5 int m=matrix.size(); 6 int n=matrix[0].size(); 7 int left=0,right=n-1; 8 int mid=0; 9 for(int i=0;i<m;i++){ 10 left=0,right=n-1,mid=(left+right)/2; 11 while(left<=right){ 12 if(matrix[i][mid]==target) 13 true; 14 else if(matrix[i][mid]<target) 15 left=mid+1; 16 else 17 right=mid-1; 18 } 19 } 20 return false; 21 }
3、用树的思想来做(104ms,56%;14.3MB,98%)
时间复杂度:O(m+n):m、n分别为矩阵的行数和列数
空间复杂度:O(1)
1 bool searchMatrix(vector<vector<int>>& matrix, int target) { 2 if(matrix.empty()) 3 return false; 4 //用m保存矩阵的行数,用n保存矩阵的列数 5 int m=matrix.size(); 6 int n=matrix[0].size(); 7 //从矩阵的左下角开始比较,target偏大则右移,偏小则上移,也可从右上角开始比较 8 //因为该矩阵中,同一行时右边大于左边,同一列时下面大于上面 9 for(int i=m-1,j=0;i>=0&&j<n;){ 10 if(matrix[i][j]==target) 11 return true; 12 else if(matrix[i][j]>target) 13 i--; 14 else 15 j++; 16 } 17 return false; 18 }