力扣74、搜索二维矩阵
1、直接循环(4ms,76%;9.3MB,31%)
时间复杂度:O(n):最坏情况要遍历整个数组
空间复杂度:O(1)
bool searchMatrix(vectorint>>& matrix, int target) { if(matrix.empty()) return false; //m为二维数组的行数,n为二维数组的列数 int m=matrix.size(); int n=matrix[0].size(); for(int i=0;i ) for(int j=0;j ){ if(matrix[i][j]==target) return true; } return false; }
2、用两次二分(4ms,76%;9.2MB,84%)
时间复杂度:O(log mn):m、n分别为矩阵行数、列数
空间复杂度:O(1)
1 bool searchMatrix(vectorint>>& matrix, int target) { 2 //m为矩阵的行数,n为矩阵的列数 3 int m=matrix.size(); 4 int n=matrix[0].size(); 5 if(matrix.empty()) 6 return false; 7 int left=0,right=m-1; 8 int mid=0; 9 int tar=-1; 10 //第一次二分,用于查找目标值所在的行 11 while(left<=right){ 12 mid=(left+right)/2; 13 //if()成立说明目标值可能在该行上 14 if(target>=matrix[mid][0]&&target<=matrix[mid][n-1]){ 15 //用tar保存该行的下标,防止和后面的mid弄混 16 tar=mid; 17 break; 18 } 19 else if(target 0]) 20 right=mid-1; 21 else 22 left=mid+1; 23 } 24 //第二次二分,用于查找该行是否有目标值 25 if(tar!=-1){ 26 left=0,right=n-1; 27 while(left<=right){ 28 mid=(left+right)/2; 29 if(matrix[tar][mid]==target) 30 return true; 31 else if(matrix[tar][mid]<target) 32 left=mid+1; 33 else 34 right=mid-1; 35 } 36 } 37 return false; 38 }
3、用树来做(0ms,100%;9.2MB,69%)
时间复杂度:O(m+n):m、n分别为矩阵行数、列数
空间复杂度:O(1)
1 bool searchMatrix(vectorint>>& matrix, int target) { 2 int m=matrix.size(); 3 int n=matrix[0].size(); 4 //判断条件这里注意要&&,整个过程利用了矩阵的有序性 5 //从首行的末尾开始比较,因为其左边的比它小,下面的比它大 6 for(int i=0,j=n-1;i =0;){ 7 if(matrix[i][j]==target) 8 return true; 9 //目前偏小则往下面跳 10 else if(matrix[i][j]<target) 11 i++; 12 //目前偏大则往左边跳 13 else 14 j--; 15 } 16 return false; 17 }