Skip to content

Commit 7509cc3

Browse files
committed
feat: add solutions to lc problem: No.0629
No.0629.K Inverse Pairs Array
1 parent a59cc7b commit 7509cc3

File tree

2 files changed

+118
-24
lines changed

2 files changed

+118
-24
lines changed

solution/0600-0699/0629.K Inverse Pairs Array/README.md

+60
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,46 @@ class Solution:
7878
return dp[k]
7979
```
8080

81+
`dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] + dp[i - 1][j - 2] + ... + dp[i - 1][j - (i - 1)]`
82+
83+
`dp[i][j - 1] = dp[i - 1][j - 1] + dp[i - 1][j - 2] + ... + dp[i - 1][j - (i - 1)] + dp[i - 1][j - i]`
84+
85+
① - ②,得 `dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - i]`
86+
87+
```python
88+
class Solution:
89+
def kInversePairs(self, n: int, k: int) -> int:
90+
N, MOD = 1010, int(1e9) + 7
91+
dp = [[0] * N for _ in range(N)]
92+
dp[1][0] = 1
93+
for i in range(2, n + 1):
94+
dp[i][0] = 1
95+
for j in range(1, k + 1):
96+
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
97+
if j >= i:
98+
dp[i][j] -= dp[i - 1][j - i]
99+
dp[i][j] %= MOD
100+
return dp[n][k]
101+
```
102+
103+
空间优化:
104+
105+
```python
106+
class Solution:
107+
def kInversePairs(self, n: int, k: int) -> int:
108+
N, MOD = 1010, int(1e9) + 7
109+
dp = [0] * N
110+
dp[0] = 1
111+
for i in range(2, n + 1):
112+
t = dp.copy()
113+
for j in range(1, k + 1):
114+
dp[j] = t[j] + dp[j - 1]
115+
if j >= i:
116+
dp[j] -= t[j - i]
117+
dp[j] %= MOD
118+
return dp[k]
119+
```
120+
81121
### **Java**
82122

83123
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -107,6 +147,26 @@ class Solution {
107147
}
108148
```
109149

150+
```java
151+
class Solution {
152+
public int kInversePairs(int n, int k) {
153+
int N = 1010, MOD = (int) (1e9 + 7);
154+
int[][] dp = new int[N][N];
155+
dp[1][0] = 1;
156+
for (int i = 2; i < n + 1; ++i) {
157+
dp[i][0] = 1;
158+
for (int j = 1; j < k + 1; ++j) {
159+
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
160+
if (j >= i) {
161+
dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + MOD) % MOD;
162+
}
163+
}
164+
}
165+
return dp[n][k];
166+
}
167+
}
168+
```
169+
110170
### **Go**
111171

112172
```go

solution/0600-0699/0629.K Inverse Pairs Array/README_EN.md

+58-24
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,12 @@
66

77
<p>Given two integers <code>n</code> and <code>k</code>, find how many different arrays consist of numbers from <code>1</code> to <code>n</code> such that there are exactly <code>k</code> inverse pairs.</p>
88

9-
10-
119
<p>We define an inverse pair as following: For <code>i<sub>th</sub></code> and <code>j<sub>th</sub></code> element in the array, if <code>i</code> &lt; <code>j</code> and <code>a[i]</code> &gt; <code>a[j]</code> then it&#39;s an inverse pair; Otherwise, it&#39;s not.</p>
1210

13-
14-
1511
<p>Since the answer may be very large, the answer should be modulo 10<sup>9</sup> + 7.</p>
1612

17-
18-
1913
<p><b>Example 1:</b></p>
2014

21-
22-
2315
<pre>
2416

2517
<b>Input:</b> n = 3, k = 0
@@ -32,16 +24,10 @@ Only the array [1,2,3] which consists of numbers from 1 to 3 has exactly 0 inver
3224

3325
</pre>
3426

35-
36-
3727
<p>&nbsp;</p>
3828

39-
40-
4129
<p><b>Example 2:</b></p>
4230

43-
44-
4531
<pre>
4632

4733
<b>Input:</b> n = 3, k = 1
@@ -54,26 +40,16 @@ The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.
5440

5541
</pre>
5642

57-
58-
5943
<p>&nbsp;</p>
6044

61-
62-
6345
<p><b>Note:</b></p>
6446

65-
66-
6747
<ol>
6848
<li>The integer <code>n</code> is in the range [1, 1000] and <code>k</code> is in the range [0, 1000].</li>
6949
</ol>
7050

71-
72-
7351
<p>&nbsp;</p>
7452

75-
76-
7753
## Solutions
7854

7955
<!-- tabs:start -->
@@ -98,6 +74,44 @@ class Solution:
9874
return dp[k]
9975
```
10076

77+
`dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] + dp[i - 1][j - 2] + ... + dp[i - 1][j - (i - 1)]`
78+
79+
`dp[i][j - 1] = dp[i - 1][j - 1] + dp[i - 1][j - 2] + ... + dp[i - 1][j - (i - 1)] + dp[i - 1][j - i]`
80+
81+
① - ②, `dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - dp[i - 1][j - i]`
82+
83+
```python
84+
class Solution:
85+
def kInversePairs(self, n: int, k: int) -> int:
86+
N, MOD = 1010, int(1e9) + 7
87+
dp = [[0] * N for _ in range(N)]
88+
dp[1][0] = 1
89+
for i in range(2, n + 1):
90+
dp[i][0] = 1
91+
for j in range(1, k + 1):
92+
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
93+
if j >= i:
94+
dp[i][j] -= dp[i - 1][j - i]
95+
dp[i][j] %= MOD
96+
return dp[n][k]
97+
```
98+
99+
```python
100+
class Solution:
101+
def kInversePairs(self, n: int, k: int) -> int:
102+
N, MOD = 1010, int(1e9) + 7
103+
dp = [0] * N
104+
dp[0] = 1
105+
for i in range(2, n + 1):
106+
t = dp.copy()
107+
for j in range(1, k + 1):
108+
dp[j] = t[j] + dp[j - 1]
109+
if j >= i:
110+
dp[j] -= t[j - i]
111+
dp[j] %= MOD
112+
return dp[k]
113+
```
114+
101115
### **Java**
102116

103117
```java
@@ -125,6 +139,26 @@ class Solution {
125139
}
126140
```
127141

142+
```java
143+
class Solution {
144+
public int kInversePairs(int n, int k) {
145+
int N = 1010, MOD = (int) (1e9 + 7);
146+
int[][] dp = new int[N][N];
147+
dp[1][0] = 1;
148+
for (int i = 2; i < n + 1; ++i) {
149+
dp[i][0] = 1;
150+
for (int j = 1; j < k + 1; ++j) {
151+
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
152+
if (j >= i) {
153+
dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + MOD) % MOD;
154+
}
155+
}
156+
}
157+
return dp[n][k];
158+
}
159+
}
160+
```
161+
128162
### **Go**
129163

130164
```go

0 commit comments

Comments
 (0)