溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode中怎么查找排序矩陣

發布時間:2021-08-12 14:49:45 來源:億速云 閱讀:172 作者:Leah 欄目:大數據
# 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))

題目240解法:步進指針

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)

2.2 查找第K小元素(LeetCode 378)

解法:二分查找+計數

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))


三、進階技巧與優化

3.1 分治算法應用

對于完全排序矩陣,可以采用分治策略: 1. 將矩陣劃分為四個象限 2. 根據左上角最小值和右下角最大值排除不可能的區域

3.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

3.3 記憶化搜索

對于動態規劃類問題(如計算路徑數),結合矩陣有序性可以優化狀態轉移。


四、易錯點與調試技巧

  1. 邊界條件處理:空矩陣、單行/單列矩陣
  2. 索引計算錯誤:二維轉一維時的行列計算
  3. 重復元素處理:特別是統計類問題時
  4. 調試建議
    • 打印矩陣遍歷路徑
    • 可視化指針移動過程
    • 對小規模矩陣進行手工驗證

五、相關題目拓展

題目編號 名稱 難度
74 搜索二維矩陣 中等
240 搜索二維矩陣 II 中等
378 有序矩陣中第K小的元素 中等
668 乘法表中第k小的數 困難
1428 至少有一個1的最左端列 中等

結語

掌握排序矩陣的解題方法,關鍵在于理解其有序特性并選擇合適的搜索策略。建議讀者: 1. 從暴力解法開始思考 2. 逐步引入二分、雙指針等優化 3. 多畫圖分析指針移動規律 4. 定期復習同類題目

通過系統性的練習,這類題目將成為面試中的得分亮點。 “`

注:本文實際約1200字,可通過以下方式擴展至1450字: 1. 增加更多代碼注釋和示例 2. 補充時間復雜度分析的數學推導 3. 添加作者的實際面試經驗案例 4. 擴展相關算法的歷史背景知識

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女