【A-劍指offer】04-二維陣列中的查詢特定數字 python實現
阿新 • • 發佈:2019-01-03
題目描述
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
解題技巧(對於這個特殊的矩陣):
1-每次查詢二維陣列的右上角元素,進行區域的縮減(也可以查詢左下角的元素)
1.1-選擇右上角元素:
if 查詢的數字 == 二維陣列的右上角元素,找到,設定標記位結束
if 查詢的數字 > 二維陣列的右上角元素,刪除該元素所在的那一行
if 查詢的數字 < 二維陣列的右上角元素,刪除該元素所在的那一列1.2-選擇左下角元素:
if 查詢的數字 == 二維陣列的右上角元素,找到,設定標記位結束
if 查詢的數字 > 二維陣列的右上角元素,刪除該元素所在的那一列
if 查詢的數字 < 二維陣列的右上角元素,刪除該元素所在的那一行
2-右上角或者左下角元素的選擇
- 對於這個特殊的二維陣列,選擇相反的確定位置元素剔除,其他位置為不確定位置,需要進行查詢的。一旦搜尋的區域有重疊,行和列的遍歷會變複雜,這是我們不希望看到的
'''
Creat by HuangDandan
2018-08-23
[email protected]
題目描述:
在一個二維陣列中(每個一維陣列的長度相同),
每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
關鍵:矩陣比較起始元素的廁
技巧:
1-返回列表的長度
list只支援len(), numpy.array同時支援len, size, shape, 注意看三者返回值的區別。
2-查詢問題設定標記位flag
'''
#選擇右上角元素
def Find1(target, array):
#獲得二維陣列的行和列大小
nCol = len(array[0]) #列數
nRow = len([a[0] for a in array]) #行數
m = nRow-1
n = nCol-1
flag = False #標記位,找到標記為True
#從二維陣列的右上方元素進行比較,右上方是關鍵,其他三個角落開始,區域均有重疊
i, j = 0 , n
while (i <= m) & (j >= 0): #易錯,這裡必須加括號
if target == array[i][j]:
flag = True
break
elif target > array[i][j]:
i, j = i+1, j
else:
i, j = i, j-1
return flag
#選擇左下角元素
def Find2(target, array):
#獲得二維陣列的行和列大小
nCol = len(array[0]) #列數
nRow = len([a[0] for a in array]) #行數
m = nRow-1
n = nCol-1
flag = False #標記位,找到標記為True
#從二維陣列的右上方元素進行比較,右上方是關鍵,其他三個角落開始,區域均有重疊
i, j = m, 0
while (i >= 0) & (j <= n): #易錯,這裡必須加括號
if target == array[i][j]:
flag = True
break
elif target > array[i][j]:
i, j = i, j+1
else:
i, j = i-1, j
return flag
if __name__ == "__main__":
array1 = [[1,2],[2,4],[5,6],[7,9]]
print(Find2(8, array1))
# print([a[0] for a in array1])
# nRow1 = len([a[0] for a in array1])
# print(nRow1)
# print(len([a[0] for a in array1]))