1. 程式人生 > >劍指offer (04):二維陣列中的查詢 (C++ & Python 實現)

劍指offer (04):二維陣列中的查詢 (C++ & Python 實現)

1 題目

在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。

例如:

[128924912471013681115]

2 題解

拿上述二維陣列來說,假設我們尋求的目標是 7。首先我們選取陣列右上角的數字 9,由於 7 小於 9,且 9 還是第四列的第一個(也是最小的)數字,因此 7 不可能出現在 9 所在的列。於是我們把這一列從我們考慮的範圍內刪除,接著分析剩下的區域(紅色框所標註區域)。

image.png

剩下的矩陣中,我們接著看右上角的數字是 8,同樣 7 小於 8,所以我們同樣的剔除 8 所在的列。

image.png

剩餘的兩列中,7 大於右上角的 2,所以 7 不可能在 2 的左邊(加上 2 的右邊在前面已經被剔除),只能在 2 的下邊。所以接著剔除 2 所在的行。

image.png

同理,7 大於 4, 最終得到下列紅色區域。右上角剛好就是我們的搜尋的目標。

image.png

總結下,發現如下規律:首先選取陣列的右上角的數字。

1. 若該數字 == target,則結束查詢。
2. 若該數字 > target,剔除該數字所在列。
3. 若該數字 < target,剔除該數字所在行。

這樣每一步縮小範圍,直到找到,或者範圍為空。同理,從左下角開始搜尋是一樣的。

3 程式碼

C++

bool
Find(int* matrix, int rows, int columns, int number) // 這裡傳入陣列 (int*)matrix 或 &matrix[0][0] { bool found = false; // 確保陣列不為空 if (matrix != nullptr && rows > 0 && columns > 0) { // 從右上角開始搜尋 int row = 0; int column = columns - 1; while (row < rows && column >= 0
) { // 步驟 1 if (matrix[row * columns + column] == number) { cout<< matrix[row * columns + column]<<endl; found = true; break; } // 步驟 2 else if (matrix[row * columns + column] > number) --column; // 步驟 3 else ++row; } } return found; }

Python

def Find(matrix, number):
    found = False
    rows = len(matrix)
    cols = len(matrix[0])
    if matrix != None and rows > 0 and cols > 0:
        row = 0
        col = cols - 1
        while(row < rows and col >= 0):
            if matrix[row][col] == number:
                found = True
                break
            elif number < matrix[row][col]:
                col -= 1
            else:
                row += 1
    return found

matrix = [[1,2,3],[4,5,6],[7,8,9]]

a = Find(matrix, 8)
print(a)