力扣240、搜索二维矩阵Ⅱ

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     }

 

上一篇:week 1 - machine learning - Andrew ng- coursera


下一篇:746-1元钱一瓶汽水,喝完后2个空瓶换1瓶汽水