劍指offer面試題3二維數組中的查找

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

須要與面試官確認的是,這個二維數組的元素是否存在重複狀況,如何處理重複狀況。數組

解題思路:
1.判斷待查找整數與矩陣的左上角的最小元素以及右下角的最大元素,若是沒在他們之間則直接返回沒有找到。函數

2.選取數組中右上角的數字,若是該數字等於要查找的數字,則查找過程結束;
3.若是該數字大於要查找的數字,則剔除這個數字所在的列;
4.若是該數字小於要查找的數字,則剔除這個數字所在的行。code

也就是說:若是要查找的數字不在數組的右上角,則每一次都在數組的查找範圍中剔除一列或者一行,這樣每一步均可以縮小查找的範圍,直到找到要查找的數字或者查找範圍爲空。排序

bool Find(int *matrix, int rows, int columns, int number)
{
    if(number < matrix[0][0] || number > matrix[rows-1][columns-1] ) return false;

    else {
        bool found = false;
        if(matrix != NULL && rows > 0 && columns > 0) {
            int row = 0;
            int column = columns-1;
            while(row < rows && column >= 0) {
                if(matrix[row*columns+column] == number) {
                    found = true;
                    break;
                } else if (matrix[row*columns + column] > number)
                    -- column;
                else
                    ++ row;
            }
        }
    }
    return found;
}

參考:《劍指Offer》class

相關文章
相關標籤/搜索