[M二分]lc74。2次元行列を検索します(2点+ダブルポインター+クラシック)

記事のディレクトリ

1.主題の出典

リンク:74。2次元行列を検索する

2.トピック分析

序文:

ダブルポインタのヤングの行列は、左下隅または右上隅から開始できます。ループの開始時に、等しい条件を判断する必要があります。そうでない場合、この等しい点をスキップして再度判断すると、エラーが発生し、見つかりません!

  • 時間計算量O(n)O(n)O n
  • スペースの複雑さO(1)O(1)O 1

下付き文字のマッピングは二分法であり、それを1次元の順序付き配列に拡張し、下付き文字のマッピングを行うだけで、順序付き配列の二分法で十分です。

  • 時間計算量O(logn)O(logn)O l o g n
  • スペースの複雑さO(1)O(1)O 1

コード:

// 双指针
class Solution {
    
    
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
    
    
        if (matrix.empty() || matrix[0].empty()) return true;

        int n = matrix.size(), m = matrix[0].size();
        int l = 0, r = m - 1; 
        while (l < n && r >= 0) {
    
    
            if (matrix[l][r] == target) return true;
            if (matrix[l][r] > target) r --;
            else l ++;
        }       
        return false;
    }
};

// 二分
class Solution {
    
    
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
    
    
        if (matrix.empty() || matrix[0].empty()) return true;

        int n = matrix.size(), m = matrix[0].size();
        int l = 0, r = m * n - 1; 
        while (l < r) {
    
    
            int mid = l + r >> 1;
            if (matrix[mid / m][mid % m] >= target) r = mid;
            else l = mid + 1;
        }       
        return matrix[l / m][l % m] == target;
    }
};

おすすめ

転載: blog.csdn.net/yl_puyu/article/details/111939104