1. 程式人生 > >【A-劍指offer】04-二維陣列中的查詢特定數字 python實現

【A-劍指offer】04-二維陣列中的查詢特定數字 python實現

題目描述
在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

解題技巧(對於這個特殊的矩陣):
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]))