劍指offer (04):二維陣列中的查詢 (C++ & Python 實現)
阿新 • • 發佈:2019-02-04
1 題目
在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
例如:
2 題解
拿上述二維陣列來說,假設我們尋求的目標是 7。首先我們選取陣列右上角的數字 9,由於 7 小於 9,且 9 還是第四列的第一個(也是最小的)數字,因此 7 不可能出現在 9 所在的列。於是我們把這一列從我們考慮的範圍內刪除,接著分析剩下的區域(紅色框所標註區域)。
剩下的矩陣中,我們接著看右上角的數字是 8,同樣 7 小於 8,所以我們同樣的剔除 8 所在的列。
剩餘的兩列中,7 大於右上角的 2,所以 7 不可能在 2 的左邊(加上 2 的右邊在前面已經被剔除),只能在 2 的下邊。所以接著剔除 2 所在的行。
同理,7 大於 4, 最終得到下列紅色區域。右上角剛好就是我們的搜尋的目標。
總結下,發現如下規律:首先選取陣列的右上角的數字。
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)