1. 程式人生 > >劍指Offer面試題3 二維陣列中的查詢

劍指Offer面試題3 二維陣列中的查詢

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

 

1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15

 

 

 

 

 

 

分析:將這個二維陣列畫成一個矩形matrix,然後從陣列中選取一個數字value(待查詢的數字為num),若matrix中含有num則分3種情況進行查詢。

①value等於num,查詢結束,函式返回true。②value大於num,根據陣列排列的規律,待查詢的數出現的範圍在value的下面或左面。②value小於num,根據陣列排列的規律,待查詢的數出現的範圍在value的上面或右面。

若matrix中不含有num則函式返回false。

出現的問題:由於要查詢的數num的位置範圍有2個,而且這2個範圍還有重疊的地方,使問題變得複雜。

解決的辦法

:首先選取陣列的右上角的數和待查詢的數字num進行比較。若查詢的數字為11,陣列右上角的數字9小於11,因為9為該行最大數所以剔除9所在行;下一行右上角的數為12大於11,剔除12所在那一列;左面一列右上角的數字9小於11,因為9為該行最大數所以剔除9所在行;下一行右上角的數10小於11,剔除10所在那一行;下一行右上角數11等於11,查詢過程結束函式返回true。

總結:選取陣列右上角的數字value。若value等於待查詢數num查詢過程結束;若value大於num,剔除value所在的列;若value小於num,剔除value所在的行。這樣每一步都可以縮小查詢的範圍。

 

#include <iostream>
using namespace std;

bool Find(int* Matrix,int rows,int columns,int number)
{
    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*column+column] == number)
            {
                found=true;
                break;
            }
            else if(Matrix[row*column+column] > number)
                --column;
            else
                ++row;
        }
    }
    return found;
}

int main()
{
    bool result;
    int matrix[4][4] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
    int* p = matrix[0];
    result=Find(p,4,2,8);
    cout << result << endl;
}