# 題目

題目

Example:

  • Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
  • Output: true
class Solution:
    def searchMatrix(self, matrix: list[list[int]], target: int) -> bool:
        # double Binary Search
        # matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
        # 先從 rows 開始找
        rows = len(matrix)

        top, down = 0, rows - 1  # rows 的頭尾
        while top <= down:
            middle_row = (top + down) // 2
            if (
                target > matrix[middle_row][-1]
            ):  # ,# 如果 target比mid的最右邊最大數字還要大,代表要往下,繼續去更大的 rows 中找
                top = middle_row + 1
            elif target < matrix[middle_row][0]:  # 比這個 rows 的最小數字還要小
                down = middle_row - 1
            else:
                break  # 找到了 數字就在現在的 matrix[middle_row]

        if not (top <= down):
            # 代表 target 在矩陣的範圍外,直接回傳 False
            # 為何還要判斷 if not (top <= bot),不直接 return False?如果沒有這個判斷,程式會繼續往下跑
            # 可能誤用 row 變數做第二次在 cols 中找,因為這時候根本沒有任何合法的 row 可以搜尋。
            return False

        l, r = 0, len(matrix[0]) - 1  # matrix[0] = cols 的長度 [[1,3,5,7],[...]]

        while l <= r:
            mid = (l + r) // 2
            if target > matrix[middle_row][mid]:  # 要更大,左邊的不要
                l = mid + 1
            elif target < matrix[middle_row][mid]:  # 要更小,右邊的不要
                r = mid - 1
            else:
                return True

        return False

時間與空間複雜度:

  • TC:O(log(m * n))
  • SC:O(1)

# Brute Force

for i in range(len(matrix)):
    for c in matrix[i]:
        if c == target:
            return True
return False

時間與空間複雜度:

  • TC:O(m * n)
  • SC:O(1)