【劍指offer】 面試題4 二維陣列中的查詢
阿新 • • 發佈:2018-12-31
題目:
在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的遞增的順序排序,請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
解題思路
關鍵是,我們從哪裡開始查詢? 如果是從頭開始查,那麼所查之數比陣列當前遍歷元素大的話,我們怎麼辦?按照本題陣列中的遞增規律,應該是向下或者向右進行搜尋,但是這樣的話就加大了搜尋的難度。
最理想的辦法是,通過每次查詢操作,都能對所搜尋的範圍進行縮小,直到找到目標(其實這個縮小搜尋範圍的思想很像二分查詢)。
有了這樣的需求,我們可以觀察二維陣列組成的一個矩陣,如果從矩陣的右上角進行查詢,那麼所查之數比陣列當前遍歷元素大的話,我們就可以進行下移並且將不再考慮當前元素所在行的左邊(因為當前元素為所在行最大的),依次類推,如果當前元素比所查元素大就刪去所在列,反之刪去所在行,這樣逐步縮小搜尋範圍,只到查到結果。同理,從左下角開始也可以。
主要程式碼c++
bool Find(int *matrix, int rows, int columns, int number)
{
bool found = false;
if(matrix != nullptr && rows >0 && columns >0)
{
int row = 0;
int column = columns - 1 // 保證從右上角開始搜素
while(row<rows && column>=0)
{
//元素在矩陣中的位置表示式 row*columns + column
// 這是關鍵!根據大小關係進行元素位置的移動
if(matrix[row*columns + column] == number)
{
found = true;
break;
}
else if(matrix[row*columns + column] > number)
-- column;
else
++row;
}
return found;
}
}