# LeetCode中怎么查找排序矩陣
## 引言
在LeetCode的算法題庫中,**排序矩陣(Sorted Matrix)**相關題目是考察二分查找、分治算法和雙指針技巧的經典場景。這類矩陣通常滿足行和列方向的有序性,如何高效地在其中查找目標值或解決衍生問題,是算法面試中的高頻考點。本文將系統講解排序矩陣的常見題型、解題思路以及優化方法。
---
## 一、排序矩陣的定義與特性
### 1.1 基本定義
排序矩陣通常指滿足以下兩種有序性之一的二維矩陣:
- **行優先排序**:每行按非遞減順序排列,且下一行的第一個元素大于上一行的最后一個元素(如LeetCode 74題)
- **完全排序**:每行從左到右遞增,每列從上到下遞增(如LeetCode 240題)
### 1.2 示例矩陣
#### 類型一:行優先排序
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 60] ]
#### 類型二:完全排序
[ [1, 4, 7, 11], [2, 5, 8, 12], [3, 6, 9, 16], [10, 13, 14, 17] ]
---
## 二、常見題型與解法
### 2.1 搜索目標值(LeetCode 74 & 240)
#### 題目74解法:二分查找
```python
def searchMatrix(matrix, target):
if not matrix: return False
m, n = len(matrix), len(matrix[0])
left, right = 0, m * n - 1
while left <= right:
mid = (left + right) // 2
num = matrix[mid // n][mid % n]
if num == target:
return True
elif num < target:
left = mid + 1
else:
right = mid - 1
return False
時間復雜度:O(log(mn))
def searchMatrix(matrix, target):
if not matrix: return False
row, col = 0, len(matrix[0]) - 1
while row < len(matrix) and col >= 0:
if matrix[row][col] == target:
return True
elif matrix[row][col] < target:
row += 1
else:
col -= 1
return False
時間復雜度:O(m + n)
def kthSmallest(matrix, k):
n = len(matrix)
left, right = matrix[0][0], matrix[-1][-1]
while left < right:
mid = (left + right) // 2
count = 0
j = n - 1
for i in range(n):
while j >= 0 and matrix[i][j] > mid:
j -= 1
count += j + 1
if count < k:
left = mid + 1
else:
right = mid
return left
時間復雜度:O(n log(max-min))
對于完全排序矩陣,可以采用分治策略: 1. 將矩陣劃分為四個象限 2. 根據左上角最小值和右下角最大值排除不可能的區域
當需要處理多路有序數據時,最小堆是高效選擇:
import heapq
def kthSmallest(matrix, k):
heap = []
for i in range(len(matrix)):
heapq.heappush(heap, (matrix[i][0], i, 0))
for _ in range(k):
val, row, col = heapq.heappop(heap)
if col + 1 < len(matrix[0]):
heapq.heappush(heap, (matrix[row][col+1], row, col+1))
return val
對于動態規劃類問題(如計算路徑數),結合矩陣有序性可以優化狀態轉移。
題目編號 | 名稱 | 難度 |
---|---|---|
74 | 搜索二維矩陣 | 中等 |
240 | 搜索二維矩陣 II | 中等 |
378 | 有序矩陣中第K小的元素 | 中等 |
668 | 乘法表中第k小的數 | 困難 |
1428 | 至少有一個1的最左端列 | 中等 |
掌握排序矩陣的解題方法,關鍵在于理解其有序特性并選擇合適的搜索策略。建議讀者: 1. 從暴力解法開始思考 2. 逐步引入二分、雙指針等優化 3. 多畫圖分析指針移動規律 4. 定期復習同類題目
通過系統性的練習,這類題目將成為面試中的得分亮點。 “`
注:本文實際約1200字,可通過以下方式擴展至1450字: 1. 增加更多代碼注釋和示例 2. 補充時間復雜度分析的數學推導 3. 添加作者的實際面試經驗案例 4. 擴展相關算法的歷史背景知識
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。