Search a 2D Matrix

来源:互联网 发布:财务流程优化 编辑:程序博客网 时间:2024/05/16 07:44
class Solution {public:    bool searchMatrix(vector<vector<int> > &matrix, int target) {        int rowNum = insertPosition(matrix, target);        if(rowNum == -1)        return true;        else        return search(matrix, target, rowNum);    }        int insertPosition(vector<vector<int> > &matrix, int target)    {        int rows = matrix.size();        int left = 0;        int right = rows - 1;        while(left <= right)        {            int middle = left + ((right - left)>>1);            if(matrix[middle][0] == target)            return -1;            else if(target < matrix[middle][0])            right = middle - 1;            else            left = middle + 1;        }        if(right < 0)        return 0;        return right;    }        bool search(vector<vector<int> > &matrix, int target, int rowNum)    {        int cols = matrix[0].size();        int left = 0;        int right = cols - 1;        while(left <= right)        {            int middle = left + ((right - left)>>1);            if(target < matrix[rowNum][middle])            right = middle - 1;            else if(target > matrix[rowNum][middle])            left = middle + 1;            else            return true;        }        return false;    }};

根据题意很自然的想到在纵向和横向分别使用二分查找,其中

纵向查找行号时,在没有找到元素时,需要找到比target小的最大数,也就是

其所在的行就是target有可能存在的行。另外要注意,函数insertPosition()中返回的

right,根据二分查找的规律来看就是要求的值,但对于right越界的情况需要单独处理

1 0
原创粉丝点击