LeetCode K個逆序對陣列(動態規劃)

2021-09-18 08:03:18 字數 1672 閱讀 9162

給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。

逆序對的定義如下:對於陣列的第i個和第 j個元素,如果滿i < j且 a[i] > a[j],則其為乙個逆序對;否則不是。

由於答案可能很大,只需要返回 答案 mod 109 + 7 的值。

示例 1:

輸入: n = 3, k = 0

輸出: 1

解釋:

只有陣列 [1,2,3] 包含了從1到3的整數並且正好擁有 0 個逆序對。

示例 2:

輸入: n = 3, k = 1

輸出: 2

解釋:

陣列 [1,3,2] 和 [2,1,3] 都有 1 個逆序對。

再往其中新增乙個數字5有如下幾種新增方式:

第一種:***x5

多出0個逆序對,因此有:f1(5,k)=f(4,k)

第二種:***5x

多出1個逆序對,因此有:f2(5,k+1)=f(4,k)=> f2(5,k)=f(4,k-1)

第三種:xx5xx

多出1個逆序對,因此有:f3(5,k+2)=f(4,k)=> f3(5,k)=f(4,k-2)

第四種:x5***

多出1個逆序對,因此有:f4(5,k+3)=f(4,k)=> f4(5,k)=f(4,k-3)

第五種:5***x

多出1個逆序對,因此有:f5(5,k+4)=f(4,k)=> f5(5,k)=f(4,k-4)

=> f(5,k) = f1 + f2 + f3 + ... + f5

=> f(5,k) = f(4,k) + f(4,k-1) + f(4,k-2) + f(4,k-3) + f(4,k-5+1)

=> f(n,k) = f(n-1,k)+f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + ... + f(n-1,k-n+1)

=> f(n,k+1) = f(n-1,k+1) + f(n-1,k-1) + f(n-1,k-2) + ... + f(n-1,k-n+2)

=> f(n,k+1) - f(n,k) = f(n-1,k+1) - f(n-1,k-n+1)

=> f(n,k+1) = f(n,k) + f(n-1,k+1) - f(n-1,k-n+1)

=> f(n,k) = f(n,k-1) + f(n-1,k) - f(n-1,k-n)

兩個遞推公式:

f(n,k) = f(n-1,k)+f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + … + f(n-1,k-n+1)

f(n,k) = f(n,k-1) + f(n-1,k) - f(n-1,k-n)

class

solution

//開始動態規劃

求陣列逆序對數

題目 對於乙個元素個數為n的陣列a,若 a i a j 且0 i j n,則a i 和a j 為乙個逆序對。現在要求給定陣列的逆序對數 解析 對於這乙個題目,最容易想到的方法即順序掃瞄整個陣列。沒掃瞄到乙個元素,則將該元素與其後面的所有元素進行比較,若後面的元素比該元素大,則找到乙個逆序數。這一過程...

629 K個逆序對陣列

給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。逆序對的定義如下 對於陣列的第i個和第 j個元素,如果滿i j且 a i a j 則其為乙個逆序對 否則不是。由於答案可能很大,只需要返回 答案 mod 109 7 的值。示例 1 輸入 n 3...

629 K個逆序對陣列

題目描述 給出兩個整數 n 和 k,找出所有包含從 1 到 n 的數字,且恰好擁有 k 個逆序對的不同的陣列的個數。逆序對的定義如下 對於陣列的第i個和第 j個元素,如果滿i j且 a i a j 則其為乙個逆序對 否則不是。由於答案可能很大,只需要返回 答案 mod 109 7 的值。解題思路 思...