当前位置 博文首页 > 中流击水,浪遏飞舟:枚举&&二分法&&剑指 Offer

    中流击水,浪遏飞舟:枚举&&二分法&&剑指 Offer

    作者:[db:作者] 时间:2021-08-26 12:41

    目的:从每行每列都递增的二位数组中查找target。

    1.枚举(最简单的方法,O(n^2)时间复杂度,忽略了行列递增排序的条件

    2.二分法(对每一行都二分查找,O(n^logn)时间复杂度,但是忽略了列递增的条件

    写了半天,原来是return true的if条件需要判断边界值left和right防止溢出,二分法没写错。

    class Solution {
    public:
        //二分查找+遍历,将双重循环的O(n^2)时间复杂度降到O(n*logn)
        bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
            if(!matrix.size()||!matrix[0].size()) return false;
            int row=matrix.size();
            int col=matrix[0].size();
            int left,right;
            for(int i=0;i<row;i++){
                if(matrix[i][col-1]<target){
                    continue;
                }
                left=0;
                right=col-1;
                while(left<=right){
                    int mid=left+((right-left)>>1);
                    if(matrix[i][mid]<=target){
                        left=mid+1;
                    }
                    else{
                        right=mid-1;
                    }
                }
                //cout<<left<<" "<<right<<endl;
                if(left>=0 && left<col && matrix[i][left]==target || right>=0 && right<col && matrix[i][right]==target){
                    return true;
                }
            }
            return false;
        }
    };
    

    3.从右上角(或者左下角)开始查找(因为从右对角线看下去此二维数组相当于二叉搜索树,充分利用了行列递增的条件

    class Solution {
    public:
        bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
            //从右上角开始,也可以从左下角开始,从右对角线看下去,这个二维数组相当于二叉搜索树
            if(!matrix.size()||!matrix[0].size()){
                return false;
            }
            int row=matrix.size(),col=matrix[0].size();
            int i=0,j=col-1;
            while(i<row && j>=0){
                if(matrix[i][j]==target){
                    return true;
                }
                else if(matrix[i][j]<target){
                    i++;
                }
                else{
                    j--;
                }
            }
            return false;
        }
    };
    
    cs