LeetCode-074. Search a 2D Matrix

1. 题目

Search a 2D Matrix

编写一个搜索m*n矩阵中的值的有效算法,该矩阵具有以下性质:
每行中的整数从左到右排序。
每行的第一个整数大于前一行的最后一个整数。

2. 分析

1:给定矩阵是有序的,可以采用两次二分查找,先找出行,再找出列
2:将该矩阵看成是一个一维数组,数组值为 matrix[ i / n ][ i % n ]

3. 代码

1)

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        if(m <= 0)
            return false;
        int n = matrix[0].size();
        if(n <= 0)
            return false;

        // 注意先判断 target 是否处于数组范围内
        if(target < matrix[0][0] || target > matrix[m - 1][n - 1])
            return false;

        int l = 0;
        int r = m - 1;
        while(l <= r)
        {
            int mid = l + ((r - l) >> 1);
            // 注意是先用第一列来判断行数,不要写成 matrix[mid]
            if(target == matrix[mid][0])
                return true;
            else if(target < matrix[mid][0])
                r = mid - 1;
            else
                l = mid + 1;
        }

        int ll = 0;
        int rr = n - 1;
        while(ll <= rr)
        {
            int lmid = ll + ((rr - ll) >> 1);
            // matrix[r][lmid] 不要选错范围
            if(target == matrix[r][lmid])
                return true;
            else if(target < matrix[r][lmid])
                rr = lmid - 1;
            else
                ll = lmid + 1;
        }

        return false;
    }
};

2)

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        if(m <= 0)
            return false;
        int n = matrix[0].size();
        if(n <= 0)
            return false;

        // 一定不要遗漏这一步
        if(target < matrix[0][0] || target > matrix[m - 1][n - 1])
            return false;

        int left = 0;
        int right = m * n - 1;
        // 注意 matrix[mid / n][mid % n] 下标不要选错
        while(left <= right)
        {
            int mid = left + ((right - left) >> 1);
            if(target == matrix[mid / n][mid % n])
                return true;
            else if(target < matrix[mid / n][mid % n])
                right = mid - 1;
            else
                left = mid + 1;
        }

        return false;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章