【LeetCode】04. 二维数组中的查找

【LeetCode】04. 二维数组中的查找_第1张图片
想法 先比较每一行 然后每一行用二分法查找

class Solution {
public:
    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        int ret=false;
        int height=matrix.size();
        if(height==0)
        {
            return ret;
        }
        int width=matrix[0].size();
        
        if(width==0)
        {
            return ret;
        }

        
        for(int i=0;i<height;i++)
        {
            if(matrix[i][width-1]<target)
            {continue;}
            if(matrix[i][0]>target)
            {
                break;
            }
            vector<int> tmp=matrix[i];
            {
                int begin=0,end=width-1;
                int midle;
                while(begin<=end)
                {
                    midle=begin+(end-begin)/2;
                    if(begin==end)
                    {
                        if(tmp[begin]==target)
                        {return true;}
                        else
                        {begin=end+1;}
                    }
                    if(tmp[midle]>=target)
                    {
                        end=midle;
                    }
                    else{begin=midle+1;}

                }
            }
        }
        return ret;
    }
};

扩展从二维数组的右上角开始查找。如果当前元素等于目标值,则返回 true。如果当前元素大于目标值,则移到左边一列。如果当前元素小于目标值,则移到下边一行。

    bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        int ret=false;
        int height=matrix.size();
        if(height==0)
        {
            return ret;
        }
        int width=matrix[0].size();
        if(width==0)
        {
            return ret;
        }
        int i=0;
        int j=width-1;
        while(i<height&&j>=0)
        {
            if(matrix[i][j]>target){j--;}
            else if(matrix[i][j]<target){i++;}
            else{return true;}
        }
        
        
        return ret;
    }

然后从左下角查找可以减少判断时间

    class Solution
    {
    public:
        bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {

        int ret=false;
        
        int i=matrix.size()-1;
        int j=0;
        while(i>=0&&j<=int(matrix[0].size()-1))//厉害
        {
            if(matrix[i][j]>target){i--;}
            else if(matrix[i][j]<target){j++;}
            else{return true;}
        }
        return ret;
    }
    };

你可能感兴趣的:(做题)