1. 程式人生 > >leet240. 搜尋二維矩陣 II

leet240. 搜尋二維矩陣 II

題目:

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

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

例如,

考慮下面的矩陣:

[
  [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

分析:

  1. 首先通過二分法,對比每行尾部元素與目標元素,排除目標元素不可能存在的行,時間複雜度O(lgn);
  2. 遍歷目標元素可能存在的行,使用二分法,在各行中尋找目標元素,直到下一行的頭部元素大於目標值或找到目標值,則終止

程式碼:

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if (not matrix) or (not matrix[0]):
            return False
        if matrix[0][0] > target or matrix[-1][-1] < target:
            return False
        len0 = len(matrix)
        len1 = len(matrix[0])
        l = 0
        r = len0 - 1
        j = -1
        while l < r:
            mid = (l + r) // 2
            # print mid
            if matrix[mid][-1] == target:
                return True
            if matrix[mid][-1] > target:
                r = mid - 1
                # if matrix[r][-1] < target:
                #     j = mid
                #     break
            if matrix[mid][-1] < target:
                l = mid + 1
                if matrix[l][-1] > target:
                    j = l
                    break
        if j == -1:
            j = l
        print "j:%d"%j

        for x in matrix[j:]:
            if x[0] > target:
                return False
            l = 0
            r = len1 - 1
            while l < r:
                mid = (l + r) // 2
                if x[mid] == target:
                    return True
                if x[mid] > target:
                    r = mid - 1
                if x[mid] < target:
                    l = mid + 1
            if x[l] == target:
                return True
        return False

思考:

  1. 需要特殊處理的情況矩陣為[]、[[]]