629. K个逆序对数组
生活随笔
收集整理的這篇文章主要介紹了
629. K个逆序对数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
629. K個逆序對數組
給出兩個整數 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 個逆序對。說明:
- n 的范圍是 [1, 1000] 并且 k 的范圍是 [0, 1000]。
解題思路
狀態轉移公式的推導
例如當n=3 ,k=2時,xxx代表n=3時的逆序對數組的任意情況,我們需要計算n=4并且k=2的情況,可以看成是向n=3時的所有逆序對數組插入值4,下面是插入的幾種情況
因此我們可以得出
dp[n+1][k]=dp[n][k-1]+dp[n][k-2]…dp[n][k-n+1]
使k=k+1得
dp[n+1][k+1]=dp[n][k]+dp[n][k-1]…dp[n][k-n+2]
兩式相減得:dp[n][k]=dp[n-1][k]+dp[n][k-1]-dp[n-1][k-n]
代碼
class Solution { public:int kInversePairs(int n, int k) {vector<vector<int>> dp(n+1,vector<int>(k+1,0));dp[1][0]=1;int mod=1000000007;for (int i = 2; i <=n; ++i) {for (int j = 0; j <=k; ++j) {dp[i][j]=dp[i-1][j]+(j-1>=0?dp[i][j-1]:0)-(j-i>=0?dp[i-1][j-i]:0);if (dp[i][j]>=mod)dp[i][j]-=mod;else if (dp[i][j]<0)dp[i][j]+=mod;}}return dp[n][k];} };總結
以上是生活随笔為你收集整理的629. K个逆序对数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到伤心哭泣是什么意思
- 下一篇: 2049. 统计最高分的节点数目