問題**:力扣演算法面試彙總
問題描述:編寫乙個高效的演算法來搜尋 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...