1. 程式人生 > >一個m*n的矩陣,從左到右從上到下都是遞增的,給一個數x,判斷x是否在矩陣中。(高效率)

一個m*n的矩陣,從左到右從上到下都是遞增的,給一個數x,判斷x是否在矩陣中。(高效率)

這樣的矩陣可以使用一個二維陣列儲存,知道了矩陣的特點,選取一個元素時可以將矩陣分割槽
這裡寫圖片描述

可以看到隨意選一個元素的話會分成四個區域,陰影部分是可能的區域,深色的是確定比要查詢的大或者小,淺色陰影是有可能,所以下一步的動作很難確定,因此,隨意取一個點進行比較然後跟進的方式會很麻煩。
從特殊位置的點下手這個問題就變得簡單了,右上和左下這兩個點拿來比較要找的元素就很好處理,這裡採用取右上元素的方式(兩種思想相同):
要查詢的元素與右上的元素比較,若比要查詢的元素大,那這一列的元素都大可以排除,故將其左移;若小了,則排除這一行的元素,將其下移,每次都可以排除一列或一行的元素;最多m+n-1次就可以判斷出是否存在

程式碼實現如下


bool Find(int* matrix, int rows, int columns, int number)
{
    if (matrix!=NULL && rows>0 && columns>0)
    {
        bool found = false;
        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; } }