Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /