↓快轉到主要內容
  1. LeetCode/

LeetCode 240: Search a 2D Matrix II

·1 分鐘· ·
LeetCode Medium Array Binary-Search Divide-and-Conquer Matrix
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-12

  • 提交紀錄:Accepted ×2 → Runtime Error ×2 → Accepted → Runtime Error → Accepted → Wrong Answer ×2 → Accepted

解題思路
#

每列由左到右遞增、每欄由上到下遞增,但列和列之間沒有接續,不能攤平。從右上角開始(Binary Search):

  • 目前的值比目標大:這一欄下面都更大,往左。
  • 比目標小:這一列左邊都更小,往下。

每一步排除一欄或一列,最多走 m + n 步。

我的嘗試
#

2022 年第一次 AC 的版本開頭寫了 if not matrix or not target: return False,target 是 0 時會直接回傳 False,只是測資沒測到。2026 年重寫時想先往右走到底、再往下走到底,但一路走下去會錯過答案,例如 [[1, 1, 3], [4, 7, 8]]、target = 7:答案 True,回傳 False。

正確解法
#

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        i, j = 0, len(matrix[0]) - 1
        while i < len(matrix) and j >= 0:
            v = matrix[i][j]
            if v == target:
                return True
            if v > target:
                j -= 1
            else:
                i += 1
        return False

複雜度
#

時間 O(m + n),空間 O(1)。

要特別避免的錯誤
#

  • 要從右上角(或左下角)開始,這兩個角的兩個方向一個變大、一個變小。
  • target 可能是 0,不能用 not target 判斷參數。

面試口說整理
#

我從右上角開始,比目標大就往左、比目標小就往下,每一步排除一欄或一列,走出邊界還沒找到就是不存在。時間 O(m + n)。

相關文章

LeetCode 74: Search a 2D Matrix
·1 分鐘
LeetCode Medium Array Binary-Search Matrix
LeetCode 74 解題筆記:每列接上一列是完整排序的,把矩陣當成長度 m × n 的一維陣列二分,mid 換成 (mid // n, mid % n)
LeetCode 162: Find Peak Element
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 162 解題筆記:nums[mid] < nums[mid + 1] 代表右邊一定有山峰(一路上升最後也會碰到邊界),否則左邊(含 mid)一定有
LeetCode 106: Construct Binary Tree from Inorder and Postorder Traversal
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 106 解題筆記:後序的最後一個是根;從後序尾巴往前取根時,要先建右子樹再建左子樹
LeetCode 48: Rotate Image
·1 分鐘
LeetCode Medium Array Math Matrix
LeetCode 48 解題筆記:順時針轉 90 度 = 先轉置再把每一列左右反轉,兩步都可以原地做
LeetCode 417: Pacific Atlantic Water Flow
·1 分鐘
LeetCode Medium Array Depth-First-Search Breadth-First-Search Matrix
LeetCode 417 解題筆記:反過來從海邊往內走,只能走到不比自己低的格子;兩個海都走得到的格子就是答案
LeetCode 105: Construct Binary Tree from Preorder and Inorder Traversal
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 105 解題筆記:前序的第一個是根,在中序裡找到根的位置就知道左子樹有幾個節點;用字典查位置,O(n)