題目:在一個(gè)二維數(shù)組中余掖,每一行都按照從左到右遞增的順序排序呼盆,每一列都按照從上到下遞增的順序排序聂使。請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù)波附,判斷數(shù)組中是否含有該整數(shù)仅醇。
分析:二分法冗美。給定數(shù)組array(行數(shù):rows,列數(shù):lows析二,待查找元素:data)粉洼,首先,遍歷數(shù)組右上角的元素(i = 0甲抖, j = cols -1)如果arr[i, j] == data漆改,則直接返回True;如果arr[i][j] > data准谚,則說(shuō)明這一列其它的數(shù)字也一定大于data挫剑,因此沒(méi)有必要繼續(xù)查找了。對(duì)行同理柱衔。
code:
def findWithBinary(arr, data):
? ? if arr is None:
? ? ? ? return
? ? i = 0
? ? rows = len(arr)
? ? cols = len(arr[0])
? ? i = 0
? ? j = cols - 1
? ? while i < rows and j >= 0:
? ? ? ? # 在數(shù)組中找到data樊破,返回
? ? ? ? if arr[i][j] == data:
? ? ? ? ? ? return True
? ? ? ? # 當(dāng)前遍歷到數(shù)組中的值大于data,data肯定不在這一列中
? ? ? ? elif arr[i][j] > data:
? ? ? ? ? ? j -= 1
? ? ? ? # 當(dāng)前遍歷到數(shù)組中的值小于data唆铐,data肯定不在這一行中
? ? ? ? else:
? ? ? ? ? ? i += 1
? ? return False
if __name__ == "__main__":
? ? arr = [[0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24], [30, 31, 32, 33, 34], [40, 41, 42, 43, 44]]
? ? print(findWithBinary(arr, 17))