1. 程式人生 > >(劍指offer python)二維陣列中的查詢

(劍指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