(劍指offer python)二維陣列中的查詢
題目 二維陣列中的查詢
題目描述
在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字7,則返回true;如果查詢數字5,由於陣列不含有該數字,則返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
解題思路
Python中沒有陣列的概念,在此用list型別來表示陣列,二維陣列可以用二維列表來表示。對於一個二維列表array,array[0]表示第一行,len(array)表示行數,len(array[0])則表示列數。
例如一個二維列表:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
思路1:
對於題目描述中的二維陣列,其實是由4個一維陣列組成。首先第一個迴圈,對二維列表進行遍歷,每次取出一個數組;其次第二個迴圈,對取出的一維陣列中的元素進行遍歷,判斷單個元素是否和目標查詢值相等。雖然可以實現題目的要求,但是沒有用到題目中一些的條件,比如:每行每列遞增。
實現
class Solution:
# array 二維列表
def Find(self, target, array):
# write code here
for row in range(len(array)):
arr = array[row]
# 對於每一行(一維陣列),在這個一維陣列中查詢target。
for index in range(len(array[0])):
if arr[index] == target:
return True
return False
思路2
二維陣列的行越右越大,列越下越大。 分析這個問題,首先吧二維陣列畫成矩形,然後從陣列中選取右上角的數字9。由於9大於7,並且9還是第4列的第一個數字。因此7不可能出現在數字9所在的列。我們可以把這一列從需要考慮的區域內剔除,之後只需要分析剩下的3列。如圖a。在剩下的矩陣中,位於右上角的數字是8。同樣8大於7,因此8所在的列也可以剔除。接下來只要分析剩下的兩列即可。如圖b
在剩下的兩列組成的陣列中,2位於陣列的右上角,2小於7,那麼要查詢的7可能在2的右邊,也可能在2的下邊。在前面的步驟中,2右邊的列已經被剔除,也就是說7不可能出現在2的右邊,因此7只有可能出現在2的下邊。於是我們把數字2所在的行也剔除,只分析剩下的三行兩列的數字。如圖c。
剩下的數字中,4位於右上角,和前面一樣,4所在的行也剔除,最後剩下兩行兩列。如圖d。最後找到7。
規律:首先選取陣列右上角的數字,如果數字等於要查詢的數字,則查詢結束;如果該數字大於要查詢的數字,則剔除這個數字所在的列;如果該數字小於要查詢的數字,則剔除這個數字所在的行。
實現
# -*- coding:utf-8 -*-
class Solution:
# array 二維列表
def Find(self, target, array):
# 主要思路:首先選取右上角的數字,如果該數字大於target,則該列全大於target,刪除該列;
# 如果該數字小於小於target,則該列全小於target,刪除該行。
found = False
row = len(array)
if row:
col = len(array[0])
else:
col = 0
if(row>0 and col>0):
i = 0
j = col - 1
while(i<row and j>=0):
if array[i][j] == target:
found = True
break
elif array[i][j] > target:
j -= 1
elif array[i][j] < target:
i += 1
return found