leet240. 搜尋二維矩陣 II
阿新 • • 發佈:2018-11-10
題目:
編寫一個高效的演算法來搜尋 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
。
分析:
- 首先通過二分法,對比每行尾部元素與目標元素,排除目標元素不可能存在的行,時間複雜度O(lgn);
- 遍歷目標元素可能存在的行,使用二分法,在各行中尋找目標元素,直到下一行的頭部元素大於目標值或找到目標值,則終止
程式碼:
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
思考:
- 需要特殊處理的情況矩陣為[]、[[]]