1. 程式人生 > >【劍指offer】 面試題4 二維陣列中的查詢

【劍指offer】 面試題4 二維陣列中的查詢

題目:

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

解題思路

關鍵是,我們從哪裡開始查詢? 如果是從頭開始查,那麼所查之數比陣列當前遍歷元素大的話,我們怎麼辦?按照本題陣列中的遞增規律,應該是向下或者向右進行搜尋,但是這樣的話就加大了搜尋的難度。

最理想的辦法是,通過每次查詢操作,都能對所搜尋的範圍進行縮小,直到找到目標(其實這個縮小搜尋範圍的思想很像二分查詢)。

有了這樣的需求,我們可以觀察二維陣列組成的一個矩陣,如果從矩陣的右上角進行查詢,那麼所查之數比陣列當前遍歷元素大的話,我們就可以進行下移並且將不再考慮當前元素所在行的左邊(因為當前元素為所在行最大的),依次類推,如果當前元素比所查元素大就刪去所在列,反之刪去所在行,這樣逐步縮小搜尋範圍,只到查到結果。同理,從左下角開始也可以。

主要程式碼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; } }