楊氏矩陣中的查詢

2021-07-11 09:40:39 字數 1424 閱讀 4191

給定乙個楊氏矩陣,如何快速查詢指定的元素?要講究技巧。

首先弄清楚什麼叫做楊氏矩陣:它的每一行從左至右是遞增的,每一列從上至下是遞減的。例如:

1, 2, 3

2, 4, 6

5, 7, 8

對於這道題,首先想到的當然是暴力方法了,兩層for迴圈巢狀查詢,在優化一下每次從每行的最後乙個元素開始比較,要是大於這個地方的值,那麼肯定不在這一行了,於是相當於刪除了一行。

當然還有更好的方法,比如我們還是從3開始比,假如要查詢的數比3大,我們可以刪除掉當前行,因為肯定不在這一行了;假如查詢的數比3小,那麼肯定不在這一列了。如此,每次從右上角(當然左下角也可以)開始比,可以刪除一行或者一列,直到找到。

下面就來實現這種方法:

/* 楊氏矩陣查詢函式 */

#define _crt_secure_no_warnings

#include #include #include //1, 2, 3

//4, 5, 6

//7, 8, 9

struct rs

;struct rs search(int arr[3], int row, int col, int val)

; while ((r < row) && (c >= 0))

else if (arr[r][c] < val)

else

}return ret;

}int main()

, ,

};struct rs ret = search(arr, 3, 3, 9);

printf("row:%d col:%d\n", ret.row, ret.col);

system("pause");

return 0;

}

這個程式健壯性不夠好,下邊再以從左下角開始比較做演示,順便提公升程式健壯性,這次不返回下標位置了:

#include #define row 4

#define col 4

int search(int *matrix, int rows, int cols, int val)

else if (val < *(matrix + row*cols + col))

else

} }

return 0; //沒找到

}int main()

, ,

, };

int ret = search(&yang[0][0], row, col, 14);

if (ret == 1)

printf("exist\n");

else

printf("not exist\n");

return 0;

}

楊氏矩陣查詢

題目為 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。例如下面的二維陣列就是每行 每列都遞增排序,如果在這個陣列中查詢數字6,則返回true 如果查詢數字10,由於陣列不含有該數字...

楊氏矩陣查詢

方案一 時間複雜度o m n 原理 從右上角開始 左下角相同 如果arr i j t,就向左查詢,如果arr i j 2013.7.23 0423 function 楊氏矩陣查詢 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個...

楊氏矩陣查詢

題目描述 楊氏矩陣,即在乙個二維陣列中,每一行都按照從左到右嚴格遞增的順序排序,每一列都按照從上到下嚴格遞增的順序排序。請完成乙個函式,輸入這樣的乙個 n n的二維陣列和 m個整數,判斷陣列中是否含有上述 m個整數。你能解決這個問題嗎?輸入格式 可能有多個測試輸入,第一行給出總共的測試輸入的個數。對...