本題中的矩陣,每行每列都是單調遞增的,
解法一:二分
這道題很容易讓人想到二分。二分如果要選左邊的元素,那麼需要用ceil函式來確定中間,這是乙個坑。然後二分的思路就是確定候選區間,先根據第乙個元素選出右區間,再根據最後乙個元素選出左區間,在區間內二分即可。
from math import ceil
class
solution
:def
findnumberin2darray
(self, matrix: list[list[
int]
], target:
int)
->
bool
:if matrix ==
or matrix ==[[
]]:return
false
defbisect
(array, num)
: l, r =0,
len(array)-1
while l < r:
mid = ceil(
(l+r)/2
)if num >= array[mid]
: l = mid
else
: r = mid-
1return l
col =
[i[0
]for i in matrix]
l =0 r = bisect(col, target)
for i, row in
enumerate
(matrix)
:if row[-1
]>= target:
l = i
break
for i in
range
(l, r+1)
: k = bisect(matrix[i]
, target)
if matrix[i]
[k]== target:
return
true
return
false
解法二:二叉搜尋樹
在題解中看到一張神奇的圖,咱們只要將這個矩陣旋轉一下就會發現,它變成了一顆二叉搜尋樹,左邊元素比他小,右邊元素比它大,咱們搜尋一下即可。
劍指offer04 二維陣列查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。測試示例 矩陣 matrix 如下 begin 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 ...
劍指offer 04 二維陣列的查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。示例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,1...
劍指Offer04 二維陣列中的查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個高效的函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,1...