劍指offer 04 單調矩陣

2021-10-21 03:28:02 字數 2120 閱讀 9379

本題中的矩陣,每行每列都是單調遞增的,

解法一:二分

這道題很容易讓人想到二分。二分如果要選左邊的元素,那麼需要用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...