數組、二分-LeetCode74. 搜索二維矩陣

1、題目描述

https://leetcode-cn.com/problems/search-a-2d-matrix/

編寫一個高效的算法來判斷 m x n 矩陣中,是否存在一個目標值。

該矩陣具有如下特性:

每行中的整數從左到右按升序排列。 每行的第一個整數大於前一行的最後一個整數(變成了240題的特例)

通用模板就看 LeetCode240:搜索二維矩陣II https://blog.csdn.net/IOT_victor/article/details/104642324

本題解法在240基礎上加了優化

2、代碼詳解

法一:縮小領域法

因爲每一行遞增,每一列遞增。所以我們可以從右上角往左下角找或者從左下角往右上角找。

每次比較可以排除一行或者一列,時間複雜度爲O(m+n)

class Solution(object):
    def searchMatrix(self, matrix, target):
        # m * n
        m = len(matrix)
        if m == 0:
            return False
        n = len(matrix[0])
        # 左下角(必須這麼設置!左下角:最後一行的最小值)從下向上
        row = m - 1
        col = 0
        while row >= 0 and col <= n-1:
            # 優化:當前行的最大值 < target
            if matrix[row][n-1] < target:
                return False
            if matrix[row][col] > target:
                row -= 1
            elif matrix[row][col] < target:
                col += 1
            else:
                return True
        return False

        # # 右上角(必須這麼設置!右上角:第一行的最大值)從上向下
        # row = 0  # 行
        # col = n - 1  # 列
        # while row <= m-1 and col >= 0:
        #     # 優化:當前行的最小值 > target
        #     if matrix[row][0] > target:
        #         return False
        #     if matrix[row][col] > target:  # 在本行中
        #         col -= 1
        #     elif matrix[row][col] < target:  # 加行
        #         row += 1
        #     else:
        #         return True
        # return False

matrix = [
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
target = 3
s = Solution()
print(s.searchMatrix(matrix, target))

法二:標準的二分查找模板

將二維矩陣拖爲一維矩陣,然後就是一個有序的一維數組了,利用二分查找就行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章