楊氏矩陣與鉤子公式

2021-07-03 16:20:10 字數 1715 閱讀 5499

楊氏矩陣又叫楊氏圖表,它是這樣乙個矩陣,滿足條件:

(1)如果格仔(i,j)沒有元素,則它右邊和上邊的相鄰格仔也一定沒有元素。

(2)如果格仔(i,j)有元素a[i][j],則它右邊和上邊的相鄰格仔要麼沒有元素,要麼有元素且比a[i][j]大。

1 ~ n所組成楊氏矩陣的個數可以通過下面的遞推式得到:

如圖就是n=3時的楊氏矩陣。

下面介紹乙個公式,那就是著名的鉤子公式

對於給定形狀,不同的楊氏矩陣的個數為:n!除以每個格仔的鉤子長度加1的積。其中鉤子長度定義為該格仔

右邊的格仔數和

它上邊的格仔數之和。

題目:

介紹完了鉤子公式,那麼我們可以來做一道基礎題了。

題目:給四行,第一行放5個數字,第二行放三個數字,第三行放3個數字,第四行放1個數字,都是左對齊的排列,

現有1~12

共12個數字,要求放到這四行中,從上到下,從左到右都是按小到大排列,問你共有幾種排法?

() () () () ()

() () ()

() () ()

()

這個問題直接利用鉤子公式解決即可。

楊氏矩陣既可以用來當堆,又可以當成平衡樹。通常楊氏矩陣會涉及到兩個問題:

(1)在楊氏矩陣中查詢值為x的元素      (2)在楊氏矩陣中找第k大的元素

對於第乙個問題,其實有兩種方法,第一種方法就是二分查詢法,這種方法的時間效率不是很好。第二種方法就是類

堆查詢法。方法是這樣的:從矩陣的右上角出發,對於元素a[i][j],如果a[i][j]==x,則找到元素x,直接返

回; 如果a[i][j]

> x,則向下移動,即繼續比較a[i+1][j]與x;如果a[i][j] < x,則向左移動,即繼續比

較a[i][j-1]與x。該演算法的時間

複雜度是o(m+n)。

bool find(int a[n],int n,int m,int x)

return false;

}

對於第二個問題,首先,二分列舉找到乙個數x,它比楊氏矩陣中k個數大;然後,利用類堆查詢法找到剛好小於x的

元素。該算

法的時間複雜度為o((m+n)log(mn)),但不需要額外儲存空間。

int get_order(int a[n],int n,int m,int k)

else col--;

}return order;

}int find_kth_num(int a[n],int n,int m,int k)

while(1);

int row = 0;

int col = m - 1;

int ret = mid;

while(row <= n - 1 && col >= 0)

else col--;

}return ret;

}

楊氏矩陣與鉤子公式

楊氏矩陣又叫楊氏圖表,它是這樣乙個矩陣,滿足條件 1 如果格仔 i,j 沒有元素,則它右邊和上邊的相鄰格仔也一定沒有元素。2 如果格仔 i,j 有元素a i j 則它右邊和上邊的相鄰格仔要麼沒有元素,要麼有元素且比a i j 大。1 n所組成楊氏矩陣的個數可以通過下面的遞推式得到 如圖就是n 3時的...

楊氏矩陣 鉤子公式

個人理解 求解勾長時,行朝格仔數減少的方向計算。給定乙個楊表 一共有n個方格。那麼把1到n這n個數字填到這個楊表中,使得每行從左到右都是遞增的,每列從下到上也是遞增的。用 dim 表示這樣的方法個數,給定乙個楊圖,各方格的位置由兩個座標決定,分別是行數與列數,列的順序是由左往右數,行的順序則是按照所...

楊氏矩陣查詢

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