1. 程式人生 > >leetcode 240. 搜尋二維矩陣 II【陣列】【Medium】&&劍指Offer面試題4:二維陣列中的查詢

leetcode 240. 搜尋二維矩陣 II【陣列】【Medium】&&劍指Offer面試題4:二維陣列中的查詢

題目:

編寫一個高效的演算法來搜尋 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性:

  • 每行的元素從左到右升序排列。
  • 每列的元素從上到下升序排列。

示例:

現有矩陣 matrix 如下:

[

  [1,   4,  7, 11, 15],

  [2,   5,  8, 12, 19],

  [3,   6,  9, 16, 22],

  [10, 13, 14, 17, 24],

  [18, 21, 23, 26, 30]

]

給定 target = 5,返回 true。

給定 target = 20,返回 false。

思路:

        該題的難點在於如何選取二維陣列中的一個參照數來與target值進行比較。如果這個值選在了二維陣列中間的某一個數,如果陣列的值剛好等於target的值時,就結束查詢過程;如果選取的數字小於要查詢的數字。那麼根據陣列的排列順序規則,要查詢的數字應該在當前選取位置的右邊或者下邊。同樣,如果選取的數字大於target的值,那麼要查詢的數字應該在當前選取位置的上邊或者左邊。如下圖:

上面分析的方法要查詢的數字在兩個區域出現且有重疊,問題就變得更復雜了。

因此,我們可以從最右上角的數字開始選起。15和5比較,15>5,那麼應該去除掉15那一列的值。接著11>5,去除掉11那一列的值;7>5,去除掉7那一列的值;4<5,去除掉4那一行的值;5=5,找到存在目標值。

程式碼:​​​

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if matrix == None or matrix == []:
            return False
        row = len(matrix)  
        col = len(matrix[0]) 
        i,j = 0,col-1
        while i<row and j>=0:
            if matrix[i][j] == target:
                return True
            elif matrix[i][j] < target:
                i += 1
            else:
                j -= 1
        return False