Skip to content

Commit 636dd79

Browse files
committed
feat: add solutions to lc problem: No.1259
No.1259.Handshakes That Don't Cross
1 parent b3e90f3 commit 636dd79

File tree

7 files changed

+252
-2
lines changed

7 files changed

+252
-2
lines changed

solution/1200-1299/1259.Handshakes That Don't Cross/README.md

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,115 @@
5656

5757
<!-- 这里可写通用的实现逻辑 -->
5858

59+
**方法一:动态规划**
60+
61+
我们定义 $f[i]$ 表示 $i$ 个人的握手方案数,初始时 $f[0]=1$,答案为 $f[numPeople]$。
62+
63+
考虑 $f[i]$,其中 $i \in [2,4,6,\cdots,numPeople]$,我们可以在顺时针方向上枚举第一个人跳过的人数 $j$,即第一个人跳过了 $j$ 个人去与另一个人握手,这里跳过的人数 $j$ 必须是偶数,所以 $j \in [0,2,4,\cdots,i-2]$,那么跳过的人的握手方案数为 $f[j]$,剩下的人数为 $k=i-j-2$,握手方案数为 $f[k]$,将这两部分相乘,再累加到 $f[i]$ 上即可,状态转移方程为:
64+
65+
$$
66+
f[i] = \sum_{j=0}^{i-2} f[j] \times f[i-j-2]
67+
$$
68+
69+
其中 $i \in [2,4,6,\cdots,numPeople]$,而 $j$ 为偶数,且 $j \in [0,2,4,\cdots,i-2]$。
70+
71+
最后答案即为 $f[numPeople]$。
72+
73+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为总人数。
74+
5975
<!-- tabs:start -->
6076

6177
### **Python3**
6278

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

6581
```python
66-
82+
class Solution:
83+
def numberOfWays(self, numPeople: int) -> int:
84+
mod = 10**9 + 7
85+
f = [0] * (numPeople + 1)
86+
f[0] = 1
87+
for i in range(2, numPeople + 1, 2):
88+
for j in range(0, i - 1, 2):
89+
k = i - j - 2
90+
f[i] = (f[i] + f[j] * f[k]) % mod
91+
return f[numPeople]
6792
```
6893

6994
### **Java**
7095

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

7398
```java
99+
class Solution {
100+
public int numberOfWays(int numPeople) {
101+
final int mod = (int) 1e9 + 7;
102+
long[] f = new long[numPeople + 1];
103+
f[0] = 1;
104+
for (int i = 2; i <= numPeople; i += 2) {
105+
for (int j = 0; j < i - 1; j += 2) {
106+
int k = i - j - 2;
107+
f[i] = (f[i] + f[j] * f[k]) % mod;
108+
}
109+
}
110+
return (int) f[numPeople];
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
int numberOfWays(int numPeople) {
121+
const int mod = 1e9 + 7;
122+
long long f[numPeople + 1];
123+
memset(f, 0, sizeof(f));
124+
f[0] = 1;
125+
for (int i = 2; i <= numPeople; i += 2) {
126+
for (int j = 0; j < i - 1; j += 2) {
127+
int k = i - j - 2;
128+
f[i] = (f[i] + f[j] * f[k]) % mod;
129+
}
130+
}
131+
return f[numPeople];
132+
}
133+
};
134+
```
135+
136+
### **Go**
137+
138+
```go
139+
func numberOfWays(numPeople int) int {
140+
const mod int = 1e9 + 7
141+
f := make([]int, numPeople+1)
142+
f[0] = 1
143+
for i := 2; i <= numPeople; i += 2 {
144+
for j := 0; j < i-1; j += 2 {
145+
k := i - j - 2
146+
f[i] = (f[i] + f[j]*f[k]) % mod
147+
}
148+
}
149+
return f[numPeople]
150+
}
151+
```
74152

153+
### **TypeScript**
154+
155+
```ts
156+
function numberOfWays(numPeople: number): number {
157+
const mod = BigInt(10 ** 9 + 7);
158+
const f: bigint[] = new Array(numPeople + 1).fill(0n);
159+
f[0] = 1n;
160+
for (let i = 2; i <= numPeople; i += 2) {
161+
for (let j = 0; j < i - 1; j += 2) {
162+
const k = i - j - 2;
163+
f[i] = (f[i] + f[j] * f[k]) % mod;
164+
}
165+
}
166+
return Number(f[numPeople]);
167+
}
75168
```
76169

77170
### **...**

solution/1200-1299/1259.Handshakes That Don't Cross/README_EN.md

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,111 @@
3636

3737
## Solutions
3838

39+
**Solution 1: Dynamic Programming**
40+
41+
We define $f[i]$ as the number of handshake schemes for $i$ people, and $f[0]=1$ at the beginning, the answer is $f[numPeople]$.
42+
43+
Considering $f[i]$, where $i \in [2,4,6,\cdots,numPeople]$, we can enumerate the number of people skipped by the first person in the clockwise direction, that is, the first person skipped $j$ people to shake hands with another person, where the number of people skipped $j$ must be even, so $j \in [0,2,4,\cdots,i-2]$, then the handshake scheme of the skipped people is $f[j]$, and the remaining number of people is $k=i-j-2$, the handshake scheme is $f[k]$, multiply these two parts and add them to $f[i]$, the state transition equation is:
44+
45+
$$
46+
f[i] = \sum_{j=0}^{i-2} f[j] \times f[i-j-2]
47+
$$
48+
49+
where $i \in [2,4,6,\cdots,numPeople]$, and $j$ is even, and $j \in [0,2,4,\cdots,i-2]$.
50+
51+
Finally, the answer is $f[numPeople]$.
52+
53+
The time complexity is $O(n^2)$, and the space complexity is $O(n)$. Where $n$ is the total number of people.
54+
3955
<!-- tabs:start -->
4056

4157
### **Python3**
4258

4359
```python
44-
60+
class Solution:
61+
def numberOfWays(self, numPeople: int) -> int:
62+
mod = 10**9 + 7
63+
f = [0] * (numPeople + 1)
64+
f[0] = 1
65+
for i in range(2, numPeople + 1, 2):
66+
for j in range(0, i - 1, 2):
67+
k = i - j - 2
68+
f[i] = (f[i] + f[j] * f[k]) % mod
69+
return f[numPeople]
4570
```
4671

4772
### **Java**
4873

4974
```java
75+
class Solution {
76+
public int numberOfWays(int numPeople) {
77+
final int mod = (int) 1e9 + 7;
78+
long[] f = new long[numPeople + 1];
79+
f[0] = 1;
80+
for (int i = 2; i <= numPeople; i += 2) {
81+
for (int j = 0; j < i - 1; j += 2) {
82+
int k = i - j - 2;
83+
f[i] = (f[i] + f[j] * f[k]) % mod;
84+
}
85+
}
86+
return (int) f[numPeople];
87+
}
88+
}
89+
```
90+
91+
### **C++**
92+
93+
```cpp
94+
class Solution {
95+
public:
96+
int numberOfWays(int numPeople) {
97+
const int mod = 1e9 + 7;
98+
long long f[numPeople + 1];
99+
memset(f, 0, sizeof(f));
100+
f[0] = 1;
101+
for (int i = 2; i <= numPeople; i += 2) {
102+
for (int j = 0; j < i - 1; j += 2) {
103+
int k = i - j - 2;
104+
f[i] = (f[i] + f[j] * f[k]) % mod;
105+
}
106+
}
107+
return f[numPeople];
108+
}
109+
};
110+
```
111+
112+
### **Go**
113+
114+
```go
115+
func numberOfWays(numPeople int) int {
116+
const mod int = 1e9 + 7
117+
f := make([]int, numPeople+1)
118+
f[0] = 1
119+
for i := 2; i <= numPeople; i += 2 {
120+
for j := 0; j < i-1; j += 2 {
121+
k := i - j - 2
122+
f[i] = (f[i] + f[j]*f[k]) % mod
123+
}
124+
}
125+
return f[numPeople]
126+
}
127+
```
50128

129+
### **TypeScript**
130+
131+
```ts
132+
function numberOfWays(numPeople: number): number {
133+
const mod = BigInt(10 ** 9 + 7);
134+
const f: bigint[] = new Array(numPeople + 1).fill(0n);
135+
f[0] = 1n;
136+
for (let i = 2; i <= numPeople; i += 2) {
137+
for (let j = 0; j < i - 1; j += 2) {
138+
const k = i - j - 2;
139+
f[i] = (f[i] + f[j] * f[k]) % mod;
140+
}
141+
}
142+
return Number(f[numPeople]);
143+
}
51144
```
52145

53146
### **...**
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public:
3+
int numberOfWays(int numPeople) {
4+
const int mod = 1e9 + 7;
5+
long long f[numPeople + 1];
6+
memset(f, 0, sizeof(f));
7+
f[0] = 1;
8+
for (int i = 2; i <= numPeople; i += 2) {
9+
for (int j = 0; j < i - 1; j += 2) {
10+
int k = i - j - 2;
11+
f[i] = (f[i] + f[j] * f[k]) % mod;
12+
}
13+
}
14+
return f[numPeople];
15+
}
16+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func numberOfWays(numPeople int) int {
2+
const mod int = 1e9 + 7
3+
f := make([]int, numPeople+1)
4+
f[0] = 1
5+
for i := 2; i <= numPeople; i += 2 {
6+
for j := 0; j < i-1; j += 2 {
7+
k := i - j - 2
8+
f[i] = (f[i] + f[j]*f[k]) % mod
9+
}
10+
}
11+
return f[numPeople]
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public int numberOfWays(int numPeople) {
3+
final int mod = (int) 1e9 + 7;
4+
long[] f = new long[numPeople + 1];
5+
f[0] = 1;
6+
for (int i = 2; i <= numPeople; i += 2) {
7+
for (int j = 0; j < i - 1; j += 2) {
8+
int k = i - j - 2;
9+
f[i] = (f[i] + f[j] * f[k]) % mod;
10+
}
11+
}
12+
return (int) f[numPeople];
13+
}
14+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def numberOfWays(self, numPeople: int) -> int:
3+
mod = 10**9 + 7
4+
f = [0] * (numPeople + 1)
5+
f[0] = 1
6+
for i in range(2, numPeople + 1, 2):
7+
for j in range(0, i - 1, 2):
8+
k = i - j - 2
9+
f[i] = (f[i] + f[j] * f[k]) % mod
10+
return f[numPeople]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function numberOfWays(numPeople: number): number {
2+
const mod = BigInt(10 ** 9 + 7);
3+
const f: bigint[] = new Array(numPeople + 1).fill(0n);
4+
f[0] = 1n;
5+
for (let i = 2; i <= numPeople; i += 2) {
6+
for (let j = 0; j < i - 1; j += 2) {
7+
const k = i - j - 2;
8+
f[i] = (f[i] + f[j] * f[k]) % mod;
9+
}
10+
}
11+
return Number(f[numPeople]);
12+
}

0 commit comments

Comments
 (0)