LeetCode 74 搜尋二維矩陣

2022-06-27 12:00:12 字數 1970 閱讀 5343

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,...