Problem
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 k
inverse pairs. Since the answer can be huge, return it modulo 10^9 + 7
.
Example 1:
Input: n = 3, k = 0
Output: 1
Explanation: Only the array [1,2,3] which consists of numbers from 1 to 3 has exactly 0 inverse pairs.
Example 2:
Input: n = 3, k = 1
Output: 2
Explanation: The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.
Constraints:
1 <= n <= 1000
0 <= k <= 1000
Solution (Java)
class Solution {
public int kInversePairs(int n, int k) {
k = Math.min(k, n * (n - 1) / 2 - k);
if (k < 0) {
return 0;
}
int[] dp = new int[k + 1];
int[] dp1 = new int[k + 1];
dp[0] = 1;
dp1[0] = 1;
int mod = 1_000_000_007;
for (int i = 1; i <= n; i++) {
int[] temp = dp;
dp = dp1;
dp1 = temp;
for (int j = 1, m = Math.min(k, i * (i - 1) / 2); j <= m; j++) {
dp[j] = (dp1[j] + dp[j - 1] - (j >= i ? dp1[j - i] : 0)) % mod;
if (dp[j] < 0) {
dp[j] += mod;
}
}
}
return dp[k];
}
}
Solution (Python3)
class Solution:
def kInversePairs(self, n: int, k: int) -> int:
kMod = int(1e9) + 7
# dp[i][j] := # of permutations of numbers 1..i with j inverse pairs
dp = [[0] * (k + 1) for _ in range(n + 1)]
# if there's no inverse pair, the permutation is unique '123..i'
for i in range(n + 1):
dp[i][0] = 1
for i in range(1, n + 1):
for j in range(1, k + 1):
dp[i][j] = (dp[i][j - 1] + dp[i - 1][j]) % kMod
if j - i >= 0:
dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + kMod) % kMod
return dp[n][k]
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).