Leetcode 629: K Inverse Pairs Array

dume0011
2 min readJul 29, 2019

Given two integers n and k, find how many different arrays consist of numbers from 1 to n such that there are exactly k inverse pairs.

We define an inverse pair as following: For ith and jth element in the array, if i < j and a[i] > a[j] then it's an inverse pair; Otherwise, it's not.

Since the answer may be very large, the answer should be modulo 109 + 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 pair.

Example 2:

Input: n = 3, k = 1
Output: 2
Explanation:
The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.

Note:

  1. The integer n is in the range [1, 1000] and k is in the range [0, 1000].

Problem Analysis:

Using dynamic programming to solve this problem.

Suppose array has n-1 elements, then insert nth element can add 0 … n-1 additional inverse pairs.

So dp[n][k] = dp[n-1][k] + dp[n-1][k-1] + … + dp[n-1][k-n+1].

And we can get dp[n][k+1] = dp[n-1][k+1] + dp[n-1][k] + … + dp[n-1][k+1-n+1] = dp[n][k] + dp[n-1][k+1]- dp[n-1][k+1-n].

Solution:

class Solution {
public:
int kInversePairs(int n, int k) {
int mod = 1000000007;
if (k > n*(n-1)/2 || k < 0) return 0;
vector<vector<long long>> dp(n+1, vector<long long>(k+1, 0));
for (int i = 1; i <= n; i++) {
dp[i][0] = 1;
for (int j = 1; j <= min(k, i*(i-1)/2); j++) {
dp[i][j] = dp[i][j-1] + dp[i-1][j];
if (j >= i) dp[i][j] -= dp[i-1][j-i];
dp[i][j] = (dp[i][j]+mod) % mod;
}
}
return (int) dp[n][k];
}
};

Time Complexity: O(n*k)

Space Complexity: O(n*k)

--

--