題目描述:給定一個 m x n 的整數矩陣,其中每一列的元素從左到右遞增排列,且每一列的第一個元素大於前一列的最後一個元素。給定一個目標值 target,請判斷 target 是否存在於矩陣中。
解題思路:由於矩陣的排列規則(每列遞增,且下一列第一個元素大於上一列最後一個元素),我們可以將整個矩陣視為一個已排序的一維陣列,並對其執行二分搜尋。
關鍵在於如何將一維的中間索引 mid 轉換回矩陣的二維座標:給定矩陣共 n 列,則 row = mid / n,col = mid % n。
演算法步驟:
lo = 0,hi = m * n - 1。mid = (lo + hi) / 2,計算對應的矩陣元素 matrix[mid/n][mid%n]。target,回傳 true;若小於 target,將 lo 移至 mid + 1;否則將 hi 移至 mid - 1。false。此方法將二維搜尋問題轉化為標準二分搜尋,時間複雜度僅需 O(log(m*n))。
時間複雜度:O(log(m×n)) — 將 m×n 的矩陣視為長度為 m×n 的有序陣列,執行一次二分搜尋,每次將搜尋範圍減半,共需 log(m×n) 次比較。
空間複雜度:O(1) — 僅使用常數個額外變數(lo、hi、mid),不需要額外的資料結構。
1. Get matrix dimensions m (rows) and n (cols) 2. Set lo = 0, hi = m * n - 1 3. While lo <= hi: a. Compute mid = lo + (hi - lo) / 2 b. Convert mid to 2D index: row = mid / n, col = mid % n c. Get value = matrix[row][col] d. If value == target: return true e. If value < target: lo = mid + 1 f. Else: hi = mid - 1 4. Return false
逐列二分搜尋 O(m log n):先找到目標值可能所在的列(第一個元素 ≤ target 且最後一個元素 ≥ target),再對該列執行二分搜尋。雖然正確,但時間複雜度略高於直接將矩陣視為一維陣列的方法。
從右上角搜尋 O(m+n):從矩陣右上角開始,若當前值大於 target 則向左移,若小於 target 則向下移。此方法時間複雜度較高但程式碼簡潔,常用於搜尋條件稍寬鬆的矩陣(不要求下列首元素大於上列末元素)。