搜尋二維矩陣II(分治法和蛇行)

2021-10-03 06:04:26 字數 2811 閱讀 3774

問題**:力扣演算法面試彙總

問題描述:編寫乙個高效的演算法來搜尋 m x n 矩陣 matrix 中的乙個目標值 target。該矩陣具有以下特性:

例子

輸入:[

[1, 4, 7, 11, 15],

[2, 5, 8, 12, 19],

[3, 6, 9, 16, 22],

[10, 13, 14, 17, 24],

[18, 21, 23, 26, 30]

]輸出:

給定 target = 5,返回 true。

給定 target = 20,返回 false。

# 二維矩陣

matrix =[[

1,4,

7,11,

15],[

2,5,

8,12,

19],[

3,6,

9,16,

22],[

10,13,

14,17,

24],[

18,21,

23,26,

30]]# 尋找目標

# target = 5

target =

20

思路:本質就是暴力演算法,乙個乙個地查詢。

# 矩陣為空的情形

iflen

(matrix)==0

:return

false

# 矩陣非空的情形

# 行列數

n, m =

len(matrix)

,len

(matrix[0]

)# 兩層遍歷

for i in

range

(n):

for j in

range

(m):

if matrix[i]

[j]== target:

return

true

return

false

思路:暴力演算法忽略了二維矩陣元素有序的資訊。利用每一行有序的資訊,我們可以關於將二維矩陣分成四個部分,其中target只可能落在兩個小矩陣裡面,然後再遞迴對這兩個小矩陣查詢。

步驟1:當前矩陣下,檢驗矩陣是否為空,以及target是否大於最大值或者小於最小值,如果任何乙個滿足,則返回false;如都不滿足,則進行步驟2

步驟2:mid=中間列的索引,計算row使得matrix[row-1][mid]<=target<=matrix[row][mid],如果target=matrix[row-1][mid]或者target=matrix[row][mid],則返回true;否則,進行步驟3

步驟3:通過步驟2可知,matrix[row-1][mid]def

search_submatrix

(matrix, target, left, right, up, down)

:if left > right or up > down:

return

false

elif target < matrix[up]

[left]

or target > matrix[down]

[right]

:return

false

else

: row = up

mid =

(left + right)//2

while row <= down and target >= matrix[row]

[mid]

:if target == matrix[row]

[mid]

:return

true

row = row +

1return search_submatrix(matrix, target, left, mid-

1, row, down)

or search_submatrix(matrix, target, mid+

1, right, up, row-1)

left, right, up, down =0,

len(matrix[0]

)-1,

0,len(matrix)-1

return search_submatrix(matrix, target, left, right, up, down)根據官方題解,其實有乙個更加巧妙的方法。

思路:從左下角位置開始,如果當前元素比target小,則往後移動一位;如果當前元素比target大,則往上移動一位。

# 行索引

cur_i =

len(matrix)-1

# 列索引

cur_j =

0while

true

:if target == matrix[cur_i]

[cur_j]

:print

(true

)break

elif target > matrix[cur_i]

[cur_j]

: cur_j +=

1else

: cur_i -=

1if cur_i <

0or cur_j >

len(matrix[0]

):print

(false

)break

搜尋二維矩陣 II

搜尋二維矩陣 ii 寫出乙個高效的演算法來搜尋m n矩陣中的值,返回這個值出現的次數。這個矩陣具有以下特性 您在真實的面試中是否遇到過這個題?yes 樣例考慮下列矩陣 1,3,5,7 2,4,7,8 3,5,9,10 給出target 3 返回2 思路 行和列都是有序的,如果以右上角為起點來判斷大小...

搜尋二維矩陣 II

寫出乙個高效的演算法來搜尋m n矩陣中的值,返回這個值出現的次數。這個矩陣具有以下特性 樣例考慮下列矩陣 1,3,5,7 2,4,7,8 3,5,9,10 給出target 3 返回2 解題思路 遞增陣列,思路為從左下或者右上開始查詢。此題,我從左下開始查詢,第乙個為3,num 然後向上移動一行,去...

搜尋二維矩陣 II

編寫乙個高效的演算法來搜尋 m x n 矩陣 matrix 中的乙個目標值 target。該矩陣具有以下特性 示例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,14,17,24 18,21,23,26,30 給定 target 5...