主要思路:首先選取右上角的數字,若是該數字大於target,則該列全大於target,刪除該列;若是該數字小於小於target,則該列全小於target,刪除該行。
從右上角元素開始,當沒到左下角元素前,不斷判斷右上角元素和target的關係,能夠不斷縮小查找範圍。
1 # -*- coding:utf-8 -*- 2 class Solution: 3 # array 二維列表 4 def insert2dArray(self, seq, row, col): 5 # 沒有使用numpy的array 6 # array = [[0] * col] * row 這種方式是淺拷貝,很差用 7 array = [[0 for i in range(col)] for i in range(row)] 8 for i in range(row): 9 for j in range(col): 10 array[i][j] = seq[i * row + j] 11 return array 12 13 def Find(self, target, array): 14 # 主要思路:首先選取右上角的數字,若是該數字大於target,則該列全大於target,刪除該列; 15 # 若是該數字小於小於target,則該列全小於target,刪除該行。 16 found = False 17 row = len(array) 18 if row: 19 col = len(array[0]) 20 else: 21 col = 0 22 23 if row > 0 and col > 0: 24 # find index of top right-hand corner 25 i = 0 26 j = col - 1 27 # if never meets lower-left corner 28 while i < row and j >= 0: 29 if array[i][j] == target: 30 found = True 31 # forget break 32 break 33 elif array[i][j] > target: 34 j -= 1 35 elif array[i][j] < target: 36 i += 1 37 return found 38 39 if __name__ == '__main__': 40 answer = Solution() 41 seq = [1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15] 42 matrix = answer.insert2dArray(seq, 4, 4) 43 print(matrix) 44 print(answer.Find(7, matrix))
顯示以下:數組
[[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]]
True
筆記:循環中找到要找到的記得break。函數