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;
}
};