楊氏矩陣中,每行元素是遞增的,每列元素也是遞增的。
思想:從矩陣的右上角(或者左下角)開始查詢num,如果a[i][j]num,則比較a[i-1][j]與num之間的關係。當a[i][j]等於num,或者i、j至少有乙個超出矩陣範圍,則結束查詢。
查詢流程圖如下所示:
演算法複雜度:o(n+m)
思想:類似於堆排序。a[0][0]必然是楊氏矩陣中最小的那個數,取出這個數,並用a[n-1][m-1]這個數替換。此時該矩陣已不滿足楊氏矩陣條件,需要對其進行調整。調整方法
a[i][j]與a[i][j+1]進行比較,得出a[i][j]與a[i][j+1]大小關係,如果a[i][j]a[i][j+1]&&a[i][j]>a[i+1][j]時,調整完畢。
偽**:
young-extract-min(a)
min←a[1,1]
a[1,1]←a[m,n]
young-min-heapify(a, 1, 1)
return min
young-min-heapify(a, i, j)
if ja[i,j+1]
then (min_i, min_j) = (i, j+1)
else (min_i, min_j) = (i, j)
if ia[i+1,j]
then (min_i, min_j) = (i+1, j)
if min_i≠i or min_j≠j
then exchange a[i,j]↔a[min_i,min_j]
young-min-heapify(a,min_i,min_j
#includeusing namespace std;
#define n 4
#define m 4
int findnum(int a[m],int num);
void young_extract_min(int a[m]);
void young_min_heapy(int a[m],int row,int col);
int main()
,,,};
int ret,num;
cin>>num;
ret=findnum(a,num);
if(ret==-1)
cout<=0&&i=0&&j=0;i--)
for(int j=m-1;j>=0;j--)
if(min_ia[row+1][col])
if(min_i!=row || min_j!=col)
}
參考: 楊氏矩陣演算法
在乙個m行n列二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。例如下面的二維陣列就是每行 每列都遞增排序。如果在這個陣列中查詢數字6,則返回true 如果查詢數字5,由於陣列不含有該數字,...
楊氏矩陣學習筆記
參考資料 ioi2019中國國家候選隊 集 袁方舟 楊氏矩陣在資訊學競賽中的應用 標準楊表大概就是行單調增,列單調增並且行數單調不增,列數單調不增的乙個矩陣 半標準楊表大概就是行或列有乙個單調不降 插入x 以行為例 從第一行開始 每次在當前行行找第乙個最小的比x大的數 找不到就插到行末並退出 否則替...
c語言楊氏矩陣演算法
楊氏矩陣 有乙個二維陣列.陣列的每行從左到右是遞增的,每列從上到下是遞增的.在這樣的陣列中查詢乙個數字是否存在。時間複雜度小於o n 陣列 1 2 3 2 3 4 3 4 5 1 3 4 2 4 5 4 5 6 1 2 3 4 5 6 7 8 9 define crt secure no warni...