difficulty:中等
編寫乙個高效的演算法來判斷m x n
矩陣中,是否存在乙個目標值。該矩陣具有如下特性:
示例 1:
輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
輸出:true
示例 2:
輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
輸出:false
solution
解法一:根據給定矩陣的特點,從矩陣中最後乙個陣列開始應用二分查詢。注意,題目中給定的matrix和target都是有效的,不必判斷輸入是否有效。
class solution:
def searchmatrix(self, matrix: list[list[int]], target: int) -> bool:
m, n = len(matrix) - 1, len(matrix[0])
for i in range(m, -1, -1):
if target == matrix[i][n-1] or target == matrix[i][0]:
return true
elif matrix[i][0] < target and target < matrix[i][n-1]:
return self.binarysearch(matrix[i], target)
else:
continue
return false
def binarysearch(self, arr, target):
low = 0
high = len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] == target:
return true
elif arr[mid] > target:
high = mid - 1
else:
low = mid + 1
return false
解法二:在上乙個解法中,我們對矩陣內的每乙個陣列都做了一次二分查詢,其實沒有必要,因為矩陣滿足從左到右從上到下都是公升序的,所以把矩陣看作是乙個長度為m*n
的公升序陣列就好了,只不過在取矩陣中元素的下標需要做一下簡單的轉換。
class solution:
def searchmatrix(self, matrix: list[list[int]], target: int) -> bool:
m, n = len(matrix), len(matrix[0])
left, right = 0, m * n - 1
while left <= right:
mid = (left + right) // 2
row, col = mid // n, mid % n
if matrix[row][col] == target:
return true
elif matrix[row][col] > target:
right = mid - 1
else:
left = mid + 1
return false
LeetCode74 搜尋二維矩陣
題目大意 要求在乙個二維矩陣中搜尋乙個數,要求是時間盡可能少。說明 二維矩陣是從左到右,從上到下依次增大的。題目分析 本題如果用挨個遍歷的話,顯然沒有利用上矩陣中的有序關係。我的做法是 將target的值與每行的最後乙個數進行比較,若最後乙個數小於target,那麼還要往下搜尋,將搜尋的行邊界的上界...
leetcode 74 搜尋二維矩陣
編寫乙個高效的演算法來判斷 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,...
Leetcode 74 搜尋二維矩陣
編寫乙個高效的演算法來判斷 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,...