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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章