Skip to content

Commit 9a7c8ed

Browse files
committed
feat: add solutions to lc problem: No.0634
No.0634.Find the Derangement of An Array
1 parent 0021ca9 commit 9a7c8ed

File tree

6 files changed

+261
-0
lines changed

6 files changed

+261
-0
lines changed

solution/0600-0699/0634.Find the Derangement of An Array/README.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,143 @@
3939

4040
<!-- 这里可写通用的实现逻辑 -->
4141

42+
**方法一:动态规划**
43+
44+
我们定义 $f[i]$ 表示长度为 $i$ 的数组的错位排列的数量。初始时 $f[0] = 1$, $f[1] = 0$。答案即为 $f[n]$。
45+
46+
对于长度为 $i$ 的数组,我们考虑将数字 $1$ 放在哪个位置,假设放在第 $j$ 个位置,这里有 $i-1$ 种选择,那么接下来数字 $j$ 可以有两种选择:
47+
48+
- 放在第 $1$ 个位置,那么剩下的 $i - 2$ 个位置可以有 $f[i - 2]$ 种错位排列,因此总共有 $(i - 1) \times f[i - 2]$ 种错位排列;
49+
- 不放在第 $1$ 个位置,那么相当于转化为了长度为 $i - 1$ 的数组的错位排列,因此总共有 $(i - 1) \times f[i - 1]$ 种错位排列。
50+
51+
综上,我们有如下状态转移方程:
52+
53+
$$
54+
f[i] = (i - 1) \times (f[i - 1] + f[i - 2])
55+
$$
56+
57+
最终答案即为 $f[n]$。注意答案的取模操作。
58+
59+
我们发现,状态转移方程中只与 $f[i - 1]$ 和 $f[i - 2]$ 有关,因此我们可以使用两个变量 $a$ 和 $b$ 来分别表示 $f[i - 1]$ 和 $f[i - 2]$,从而将空间复杂度降低到 $O(1)$。
60+
61+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
62+
4263
<!-- tabs:start -->
4364

4465
### **Python3**
4566

4667
<!-- 这里可写当前语言的特殊实现逻辑 -->
4768

4869
```python
70+
class Solution:
71+
def findDerangement(self, n: int) -> int:
72+
mod = 10**9 + 7
73+
f = [1] + [0] * n
74+
for i in range(2, n + 1):
75+
f[i] = (i - 1) * (f[i - 1] + f[i - 2]) % mod
76+
return f[n]
77+
```
4978

79+
```python
80+
class Solution:
81+
def findDerangement(self, n: int) -> int:
82+
mod = 10**9 + 7
83+
a, b = 1, 0
84+
for i in range(2, n + 1):
85+
a, b = b, ((i - 1) * (a + b)) % mod
86+
return b
5087
```
5188

5289
### **Java**
5390

5491
<!-- 这里可写当前语言的特殊实现逻辑 -->
5592

5693
```java
94+
class Solution {
95+
public int findDerangement(int n) {
96+
long[] f = new long[n + 1];
97+
f[0] = 1;
98+
final int mod = (int) 1e9 + 7;
99+
for (int i = 2; i <= n; ++i) {
100+
f[i] = (i - 1) * (f[i - 1] + f[i - 2]) % mod;
101+
}
102+
return (int) f[n];
103+
}
104+
}
105+
```
106+
107+
```java
108+
class Solution {
109+
public int findDerangement(int n) {
110+
final int mod = (int) 1e9 + 7;
111+
long a = 1, b = 0;
112+
for (int i = 2; i <= n; ++i) {
113+
long c = (i - 1) * (a + b) % mod;
114+
a = b;
115+
b = c;
116+
}
117+
return (int) b;
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
int findDerangement(int n) {
128+
long long f[n + 1];
129+
memset(f, 0, sizeof(f));
130+
f[0] = 1;
131+
const int mod = 1e9 + 7;
132+
for (int i = 2; i <= n; i++) {
133+
f[i] = (i - 1LL) * (f[i - 1] + f[i - 2]) % mod;
134+
}
135+
return f[n];
136+
}
137+
};
138+
```
139+
140+
```cpp
141+
class Solution {
142+
public:
143+
int findDerangement(int n) {
144+
long long a = 1, b = 0;
145+
const int mod = 1e9 + 7;
146+
for (int i = 2; i <= n; ++i) {
147+
long long c = (i - 1) * (a + b) % mod;
148+
a = b;
149+
b = c;
150+
}
151+
return b;
152+
}
153+
};
154+
```
155+
156+
### **Go**
157+
158+
```go
159+
func findDerangement(n int) int {
160+
f := make([]int, n+1)
161+
f[0] = 1
162+
const mod = 1e9 + 7
163+
for i := 2; i <= n; i++ {
164+
f[i] = (i - 1) * (f[i-1] + f[i-2]) % mod
165+
}
166+
return f[n]
167+
}
168+
```
57169

170+
```go
171+
func findDerangement(n int) int {
172+
a, b := 1, 0
173+
const mod = 1e9 + 7
174+
for i := 2; i <= n; i++ {
175+
a, b = b, (i-1)*(a+b)%mod
176+
}
177+
return b
178+
}
58179
```
59180

60181
### **...**

solution/0600-0699/0634.Find the Derangement of An Array/README_EN.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,113 @@
3838
### **Python3**
3939

4040
```python
41+
class Solution:
42+
def findDerangement(self, n: int) -> int:
43+
mod = 10**9 + 7
44+
f = [1] + [0] * n
45+
for i in range(2, n + 1):
46+
f[i] = (i - 1) * (f[i - 1] + f[i - 2]) % mod
47+
return f[n]
48+
```
4149

50+
```python
51+
class Solution:
52+
def findDerangement(self, n: int) -> int:
53+
mod = 10**9 + 7
54+
a, b = 1, 0
55+
for i in range(2, n + 1):
56+
a, b = b, ((i - 1) * (a + b)) % mod
57+
return b
4258
```
4359

4460
### **Java**
4561

4662
```java
63+
class Solution {
64+
public int findDerangement(int n) {
65+
long[] f = new long[n + 1];
66+
f[0] = 1;
67+
final int mod = (int) 1e9 + 7;
68+
for (int i = 2; i <= n; ++i) {
69+
f[i] = (i - 1) * (f[i - 1] + f[i - 2]) % mod;
70+
}
71+
return (int) f[n];
72+
}
73+
}
74+
```
75+
76+
```java
77+
class Solution {
78+
public int findDerangement(int n) {
79+
final int mod = (int) 1e9 + 7;
80+
long a = 1, b = 0;
81+
for (int i = 2; i <= n; ++i) {
82+
long c = (i - 1) * (a + b) % mod;
83+
a = b;
84+
b = c;
85+
}
86+
return (int) b;
87+
}
88+
}
89+
```
90+
91+
### **C++**
92+
93+
```cpp
94+
class Solution {
95+
public:
96+
int findDerangement(int n) {
97+
long long f[n + 1];
98+
memset(f, 0, sizeof(f));
99+
f[0] = 1;
100+
const int mod = 1e9 + 7;
101+
for (int i = 2; i <= n; i++) {
102+
f[i] = (i - 1LL) * (f[i - 1] + f[i - 2]) % mod;
103+
}
104+
return f[n];
105+
}
106+
};
107+
```
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
int findDerangement(int n) {
113+
long long a = 1, b = 0;
114+
const int mod = 1e9 + 7;
115+
for (int i = 2; i <= n; ++i) {
116+
long long c = (i - 1) * (a + b) % mod;
117+
a = b;
118+
b = c;
119+
}
120+
return b;
121+
}
122+
};
123+
```
124+
125+
### **Go**
126+
127+
```go
128+
func findDerangement(n int) int {
129+
f := make([]int, n+1)
130+
f[0] = 1
131+
const mod = 1e9 + 7
132+
for i := 2; i <= n; i++ {
133+
f[i] = (i - 1) * (f[i-1] + f[i-2]) % mod
134+
}
135+
return f[n]
136+
}
137+
```
47138

139+
```go
140+
func findDerangement(n int) int {
141+
a, b := 1, 0
142+
const mod = 1e9 + 7
143+
for i := 2; i <= n; i++ {
144+
a, b = b, (i-1)*(a+b)%mod
145+
}
146+
return b
147+
}
48148
```
49149

50150
### **...**
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int findDerangement(int n) {
4+
long long a = 1, b = 0;
5+
const int mod = 1e9 + 7;
6+
for (int i = 2; i <= n; ++i) {
7+
long long c = (i - 1) * (a + b) % mod;
8+
a = b;
9+
b = c;
10+
}
11+
return b;
12+
}
13+
};
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
func findDerangement(n int) int {
2+
a, b := 1, 0
3+
const mod = 1e9 + 7
4+
for i := 2; i <= n; i++ {
5+
a, b = b, (i-1)*(a+b)%mod
6+
}
7+
return b
8+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public int findDerangement(int n) {
3+
final int mod = (int) 1e9 + 7;
4+
long a = 1, b = 0;
5+
for (int i = 2; i <= n; ++i) {
6+
long c = (i - 1) * (a + b) % mod;
7+
a = b;
8+
b = c;
9+
}
10+
return (int) b;
11+
}
12+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def findDerangement(self, n: int) -> int:
3+
mod = 10**9 + 7
4+
a, b = 1, 0
5+
for i in range(2, n + 1):
6+
a, b = b, ((i - 1) * (a + b)) % mod
7+
return b

0 commit comments

Comments
 (0)