import numpy as np
#這裏是從一個有序二維數組中(從左到右遞增,從上到下遞增)查找一個數字
#要求的時間複雜度是O(m+n)
#這就要求不能用循環了
#非常機敏的方法是數組從右上角查找,若其大於目標數值,則向左走
#表現爲索引值列數減1
#若其小於目標值,則其行數加1
#表現爲索引值行號加1
#這算法寫得真牛,不知道誰寫出來的,厲害,在此實現,向前輩致敬
#總結:算法的問題就是確定的問題,規律的問題。在這裏,我們知道了遞增方向
#按照常有思維是從小到大找,從左到右找。這在沒有時間複雜度的要求的情況下是
#完全合格的。但是在有O(m+n)的前提下,我們需要找到一個類似"二分法"的路徑。
#從右上角尋找就完全滿足了“二分法”這一點要求。從右上角開始搜索的時候,
#我們知道,向左走,數值減小;向右走,數值增大。這就是“二分法”的一個完美場景。
#牛逼了,前輩!
#定義一個二維數組
a = [[1,4,7,11],
[2,5,8,12],
[3,6,9,16],
[10,13,14,17],
[18,21,23,26]
]
#將數組轉換爲二維矩陣的形式,方便後續查找(要使用到二維數組的維度信息)
a = np.array(a)
#定義右上角索引值,即開始查找的位置
i = 0#row
j = a.shape[1] - 1#col
#定義要查找的目標值
target = 8
#定義一個查詢標記:如果經過後續查找,我們發現其有相應值,標記其爲真;
#否則,不作響應,保持其爲假的狀態
b = False
#查找
while (i>=0)&(j>=0):
if a[i][j] == target:
b = True
break
if a[i][j]<target:
i = i + 1
if a[i][j]>target:
j = j - 1
#輸出跳出喜歡時候,查找結束的索引值
print("Index:("+str(i)+","+str(j)+")")
#輸出查找結果
if b:
print("Exist the target num:",target)
else:
print("Don't exists the target num:",target)