Skip to content

Commit bc28a99

Browse files
authored
Merge pull request #2108 from agarwalhimanshugaya/dsa4
add question no 629
2 parents 48910f0 + fd9fea6 commit bc28a99

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
---
2+
id: k-inverse-pairs-array
3+
title: K Inverse Pairs Array
4+
sidebar_label: 0629 - K Inverse Pairs Array
5+
tags:
6+
- Dynammic Programming
7+
- C++
8+
- Java
9+
- Python
10+
description: "This is a solution to the K Inverse Pairs Array problem on LeetCode."
11+
---
12+
13+
## Problem Description
14+
15+
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]`.
16+
17+
Given two integers n and k, return the number of different arrays consisting of numbers from `1 to n` such that there are exactly k inverse pairs. Since the answer can be huge, return it modulo `109 + 7`.
18+
19+
### Examples
20+
21+
**Example 1:**
22+
23+
```
24+
Input: n = 3, k = 0
25+
Output: 1
26+
Explanation: Only the array [1,2,3] which consists of numbers from 1 to 3 has exactly 0 inverse pairs.
27+
28+
```
29+
**Example 2:**
30+
31+
```
32+
Input: n = 3, k = 1
33+
Output: 2
34+
Explanation: The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.
35+
36+
```
37+
### Constraints
38+
39+
- `1 <= n <= 1000`
40+
- `0 <= k <= 1000`
41+
42+
## Solution for K Inverse Pairs Array
43+
44+
### Approach
45+
46+
`dp[n][k]` denotes the number of arrays that have k inverse pairs for array composed of `1 to n`
47+
we can establish the recursive relationship between `dp[n][k]` and `dp[n-1][i]`:
48+
49+
if we put n as the last number then all the k inverse pair should come from the first `n-1` numbers
50+
if we put n as the second last number then there's 1 inverse pair involves n so the rest `k-1` comes from the first n-1 numbers
51+
...
52+
if we put n as the first number then there's `n-1` inverse pairs involve n so the rest `k-(n-1)` comes from the first `n-1` numbers
53+
54+
`dp[n][k] = dp[n-1][k]+dp[n-1][k-1]+dp[n-1][k-2]+...+dp[n-1][k+1-n+1]+dp[n-1][k-n+1]`
55+
56+
It's possible that some where in the right hand side the second array index become negative, since we cannot generate negative inverse pairs we just treat them as 0, but still leave the item there as a place holder.
57+
58+
`dp[n][k] = dp[n-1][k]+dp[n-1][k-1]+dp[n-1][k-2]+...+dp[n-1][k+1-n+1]+dp[n-1][k-n+1]`
59+
`dp[n][k+1] = dp[n-1][k+1]+dp[n-1][k]+dp[n-1][k-1]+dp[n-1][k-2]+...+dp[n-1][k+1-n+1]`
60+
61+
so by deducting the first line from the second line, we have
62+
63+
`dp[n][k+1] = dp[n][k]+dp[n-1][k+1]-dp[n-1][k+1-n]`
64+
65+
66+
## Code in Different Languages
67+
68+
<Tabs>
69+
<TabItem value="cpp" label="C++">
70+
<SolutionAuthor name="@Shreyash3087"/>
71+
72+
```cpp
73+
int kInversePairs(int n, int k) {
74+
vector<int> dp(k+1, 0);
75+
int mod = 1e9+7;
76+
for(int i=1; i<=n; i++){
77+
vector<int> tmp(k+1, 0);
78+
tmp[0] = 1;
79+
for(int j =1; j<=k; j++){
80+
long long val = (dp[j] + mod - ((j-i) >=0 ? dp[j-i] : 0))%mod;
81+
tmp[j] = (tmp[j-1] + val)%mod;
82+
}
83+
dp = tmp;
84+
}
85+
return (dp[k] + mod - (k>0 ? dp[k-1] : 0))%mod;
86+
}
87+
88+
```
89+
</TabItem>
90+
<TabItem value="java" label="Java">
91+
<SolutionAuthor name="@agarwalhimanshugaya"/>
92+
93+
```java
94+
public static int kInversePairs(int n, int k) {
95+
int mod = 1000000007;
96+
if (k > n*(n-1)/2 || k < 0) return 0;
97+
if (k == 0 || k == n*(n-1)/2) return 1;
98+
long[][] dp = new long[n+1][k+1];
99+
dp[2][0] = 1;
100+
dp[2][1] = 1;
101+
for (int i = 3; i <= n; i++) {
102+
dp[i][0] = 1;
103+
for (int j = 1; j <= Math.min(k, i*(i-1)/2); j++) {
104+
dp[i][j] = dp[i][j-1] + dp[i-1][j];
105+
if (j >= i) dp[i][j] -= dp[i-1][j-i];
106+
dp[i][j] = (dp[i][j]+mod) % mod;
107+
}
108+
}
109+
return (int) dp[n][k];
110+
}
111+
```
112+
113+
</TabItem>
114+
<TabItem value="python" label="Python">
115+
<SolutionAuthor name="@agarwalhimanshugaya"/>
116+
117+
```python
118+
class Solution:
119+
def kInversePairs(self, n: int, k: int) -> int:
120+
121+
max_possible_inversions = (n * (n-1)//2)
122+
if k > max_possible_inversions:
123+
return 0
124+
if k == 0 or k == max_possible_inversions:
125+
return 1
126+
127+
MOD = pow(10,9) + 7
128+
129+
dp = [[0]*(k+1) for _ in range(n+1)]
130+
131+
for i in range(1, n+1):
132+
dp[i][0] = 1
133+
134+
dp[2][1] = 1
135+
136+
for i in range(3,n+1):
137+
max_possible_inversions = min(k, i*(i-1)//2)
138+
for j in range(1, max_possible_inversions + 1):
139+
dp[i][j] = dp[i][j-1] + dp[i-1][j]
140+
if j>=i:
141+
dp[i][j] -= dp[i-1][j - i]
142+
dp[i][j] = (dp[i][j] + MOD) % MOD
143+
144+
return dp[n][k]
145+
146+
```
147+
</TabItem>
148+
</Tabs>
149+
150+
## Complexity Analysis
151+
152+
### Time Complexity: $O(N*k)$
153+
154+
### Space Complexity: $O(N*k)$
155+
156+
157+
## References
158+
159+
- **LeetCode Problem**: [Kth Largest Element in a Stream](https://leetcode.com/problems/k-inverse-pairs-array/description/)
160+
161+
- **Solution Link**: [Kth Largest Element in a Stream](https://leetcode.com/problems/k-inverse-pairs-array/solutions/)

0 commit comments

Comments
 (0)