For an integer array nums, an inverse pair is a pair of integers [i, j] where 0 <= i < j < nums.length and nums[i] > nums[j].
Given two integers n and k, return the number of different arrays consist of numbers from 1 to n such that there are exactly kinverse pairs. Since the answer can be huge, return it modulo10^9 + 7.
We can build up the answer for n and k by considering how many ways we can insert the largest number at different positions, which creates a certain number of new inverse pairs. Using prefix sums allows us to efficiently compute the DP transitions.
classSolution {
publicintkInversePairs(int n, int k) {
int mod = 1000000007;
int[][] dp =newint[n+1][k+1];
dp[0][0]= 1;
for (int i = 1; i <= n; ++i) {
int[] prefix =newint[k+2];
for (int j = 0; j <= k; ++j) prefix[j+1]= (prefix[j]+ dp[i-1][j]) % mod;
for (int j = 0; j <= k; ++j) {
int l = Math.max(0, j-i+1);
dp[i][j]= (prefix[j+1]- prefix[l]+ mod) % mod;
}
}
return dp[n][k];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
funkInversePairs(n: Int, k: Int): Int {
val mod = 1_000_000_007
val dp = Array(n+1) { IntArray(k+1) }
dp[0][0] = 1for (i in1..n) {
val prefix = IntArray(k+2)
for (j in0..k) prefix[j+1] = (prefix[j] + dp[i-1][j]) % mod
for (j in0..k) {
val l = maxOf(0, j-i+1)
dp[i][j] = (prefix[j+1] - prefix[l] + mod) % mod
}
}
return dp[n][k]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
defkInversePairs(self, n: int, k: int) -> int:
mod =10**9+7 dp = [[0]*(k+1) for _ in range(n+1)]
dp[0][0] =1for i in range(1, n+1):
prefix = [0]*(k+2)
for j in range(k+1):
prefix[j+1] = (prefix[j] + dp[i-1][j]) % mod
for j in range(k+1):
l = max(0, j-i+1)
dp[i][j] = (prefix[j+1] - prefix[l] + mod) % mod
return dp[n][k]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
impl Solution {
pubfnk_inverse_pairs(n: i32, k: i32) -> i32 {
let n = n asusize;
let k = k asusize;
let modn =1_000_000_007;
letmut dp =vec![vec![0; k+1]; n+1];
dp[0][0] =1;
for i in1..=n {
letmut prefix =vec![0; k+2];
for j in0..=k { prefix[j+1] = (prefix[j] + dp[i-1][j]) % modn; }
for j in0..=k {
let l =if j+1< i { 0 } else { j+1-i };
dp[i][j] = (prefix[j+1] - prefix[l] + modn) % modn;
}
}
dp[n][k]
}
}
⏰ Time complexity: O(n*k) where n is the array length and k is the number of inverse pairs. Each DP state is computed in constant time using prefix sums.