74. 搜尋二維矩陣(python)
阿新 • • 發佈:2018-12-21
題目描述(中等)
編寫一個高效的演算法來判斷 m x n 矩陣中,是否存在一個目標值。該矩陣具有如下特性:
- 每行中的整數從左到右按升序排列。
- 每行的第一個整數大於前一行的最後一個整數。
示例 1:
輸入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 3 輸出: true
示例 2:
輸入: matrix = [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] target = 13 輸出:false
思路分析
明顯此題使用二分查詢法。
我自己的直接想法是:利用二分查詢,先求出target所在的行,然後在求出所在的列。找到返回True,否則返回False。如程式碼1
網上看別人寫的程式碼看起來比較簡單,但都是二分法,我覺得差不多。思路:直接對matrix所有元素進行二分查詢。如程式碼2
程式碼
程式碼1:
class Solution: def findRow(self, matrix, target): start = 0 end = len(matrix) - 1 while start < end: mid = (start + end) // 2 if target < matrix[mid][0]: end = mid-1 elif target > matrix[mid][-1]: start = mid+1 else: return mid return start def searchMatrix(self, matrix, target): """ :type matrix: List[List[int]] :type target: int :rtype: bool """ if matrix==[]: return False Row = self.findRow(matrix, target) n = len(matrix[0]) startC = 0 endC = n - 1 while startC < endC+1: mid = (startC + endC) // 2 if target == matrix[Row][mid]: return True elif target < matrix[Row][mid]: endC = mid-1 else: startC = mid+1 return False
程式碼2:
class Solution: def searchMatrix(self, matrix, target): """ :type matrix: List[List[int]] :type target: int :rtype: bool """ if matrix == []: return False m, n = len(matrix), len(matrix[0]) low = 0 high = m * n while low < high: mid = (low + high) // 2 if matrix[mid // n][mid % n] == target: return True elif matrix[mid // n][mid % n] < target: low = mid + 1 else: high = mid return False