Skip to content

Commit d9b96ad

Browse files
authored
feat: add solutions to lc problems: No.1256,1259,1570 (doocs#1287)
* No.1256.Encode Number * No.1259.Handshakes That Don't Cross * No.1570.Dot Product of Two Sparse Vectors
1 parent 0b8c776 commit d9b96ad

File tree

21 files changed

+887
-113
lines changed

21 files changed

+887
-113
lines changed

solution/1200-1299/1256.Encode Number/README.md

+50-1
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,71 @@
3838

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

41+
**方法一:位运算**
42+
43+
我们将 $num$ 加一,然后将其转换为二进制字符串,去掉最高位的 $1$ 即可。
44+
45+
时间复杂度 $O(\log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为 $num$ 的大小。
46+
4147
<!-- tabs:start -->
4248

4349
### **Python3**
4450

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

4753
```python
48-
54+
class Solution:
55+
def encode(self, num: int) -> str:
56+
return bin(num + 1)[3:]
4957
```
5058

5159
### **Java**
5260

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

5563
```java
64+
class Solution {
65+
public String encode(int num) {
66+
return Integer.toBinaryString(num + 1).substring(1);
67+
}
68+
}
69+
```
70+
71+
### **C++**
72+
73+
```cpp
74+
class Solution {
75+
public:
76+
string encode(int num) {
77+
bitset<32> bs(++num);
78+
string ans = bs.to_string();
79+
int i = 0;
80+
while (ans[i] == '0') {
81+
++i;
82+
}
83+
return ans.substr(i + 1);
84+
}
85+
};
86+
```
87+
88+
### **Go**
89+
90+
```go
91+
func encode(num int) string {
92+
num++
93+
s := strconv.FormatInt(int64(num), 2)
94+
return s[1:]
95+
}
96+
```
97+
98+
### **TypeScript**
5699

100+
```ts
101+
function encode(num: number): string {
102+
++num;
103+
let s = num.toString(2);
104+
return s.slice(1);
105+
}
57106
```
58107

59108
### **...**

solution/1200-1299/1256.Encode Number/README_EN.md

+44-1
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,56 @@
3939
### **Python3**
4040

4141
```python
42-
42+
class Solution:
43+
def encode(self, num: int) -> str:
44+
return bin(num + 1)[3:]
4345
```
4446

4547
### **Java**
4648

4749
```java
50+
class Solution {
51+
public String encode(int num) {
52+
return Integer.toBinaryString(num + 1).substring(1);
53+
}
54+
}
55+
```
56+
57+
### **C++**
58+
59+
```cpp
60+
class Solution {
61+
public:
62+
string encode(int num) {
63+
bitset<32> bs(++num);
64+
string ans = bs.to_string();
65+
int i = 0;
66+
while (ans[i] == '0') {
67+
++i;
68+
}
69+
return ans.substr(i + 1);
70+
}
71+
};
72+
```
73+
74+
### **Go**
75+
76+
```go
77+
func encode(num int) string {
78+
num++
79+
s := strconv.FormatInt(int64(num), 2)
80+
return s[1:]
81+
}
82+
```
83+
84+
### **TypeScript**
4885

86+
```ts
87+
function encode(num: number): string {
88+
++num;
89+
let s = num.toString(2);
90+
return s.slice(1);
91+
}
4992
```
5093

5194
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
public:
3+
string encode(int num) {
4+
bitset<32> bs(++num);
5+
string ans = bs.to_string();
6+
int i = 0;
7+
while (ans[i] == '0') {
8+
++i;
9+
}
10+
return ans.substr(i + 1);
11+
}
12+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
func encode(num int) string {
2+
num++
3+
s := strconv.FormatInt(int64(num), 2)
4+
return s[1:]
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Solution {
2+
public String encode(int num) {
3+
return Integer.toBinaryString(num + 1).substring(1);
4+
}
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class Solution:
2+
def encode(self, num: int) -> str:
3+
return bin(num + 1)[3:]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function encode(num: number): string {
2+
++num;
3+
let s = num.toString(2);
4+
return s.slice(1);
5+
}

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

+125-1
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,146 @@
5656

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

59+
**方法一:记忆化搜索**
60+
61+
我们设计一个函数 $dfs(i)$,表示 $i$ 个人的握手方案数。答案为 $dfs(n)$。
62+
63+
函数 $dfs(i)$ 的执行逻辑如下:
64+
65+
- 如果 $i \lt 2$,那么只有一种握手方案,即不握手,返回 $1$。
66+
- 否则,我们可以枚举第一个人与谁握手,记剩余的左边的人数为 $l$,右边的人数为 $r=i-l-2$,那么有 $dfs(i)= \sum_{l=0}^{i-1} dfs(l) \times dfs(r)$。
67+
68+
为了避免重复计算,我们使用记忆化搜索的方法。
69+
70+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为 $numPeople$ 的大小。
71+
5972
<!-- tabs:start -->
6073

6174
### **Python3**
6275

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

6578
```python
66-
79+
class Solution:
80+
def numberOfWays(self, numPeople: int) -> int:
81+
@cache
82+
def dfs(i: int) -> int:
83+
if i < 2:
84+
return 1
85+
ans = 0
86+
for l in range(0, i, 2):
87+
r = i - l - 2
88+
ans += dfs(l) * dfs(r)
89+
ans %= mod
90+
return ans
91+
92+
mod = 10**9 + 7
93+
return dfs(numPeople)
6794
```
6895

6996
### **Java**
7097

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

73100
```java
101+
class Solution {
102+
private int[] f;
103+
private final int mod = (int) 1e9 + 7;
104+
105+
public int numberOfWays(int numPeople) {
106+
f = new int[numPeople + 1];
107+
return dfs(numPeople);
108+
}
109+
110+
private int dfs(int i) {
111+
if (i < 2) {
112+
return 1;
113+
}
114+
if (f[i] != 0) {
115+
return f[i];
116+
}
117+
for (int l = 0; l < i; l += 2) {
118+
int r = i - l - 2;
119+
f[i] = (int) ((f[i] + (1L * dfs(l) * dfs(r) % mod)) % mod);
120+
}
121+
return f[i];
122+
}
123+
}
124+
```
125+
126+
### **C++**
127+
128+
```cpp
129+
class Solution {
130+
public:
131+
int numberOfWays(int numPeople) {
132+
const int mod = 1e9 + 7;
133+
int f[numPeople + 1];
134+
memset(f, 0, sizeof(f));
135+
function<int(int)> dfs = [&](int i) {
136+
if (i < 2) {
137+
return 1;
138+
}
139+
if (f[i]) {
140+
return f[i];
141+
}
142+
for (int l = 0; l < i; l += 2) {
143+
int r = i - l - 2;
144+
f[i] = (f[i] + 1LL * dfs(l) * dfs(r) % mod) % mod;
145+
}
146+
return f[i];
147+
};
148+
return dfs(numPeople);
149+
}
150+
};
151+
```
152+
153+
### **Go**
154+
155+
```go
156+
func numberOfWays(numPeople int) int {
157+
const mod int = 1e9 + 7
158+
f := make([]int, numPeople+1)
159+
var dfs func(int) int
160+
dfs = func(i int) int {
161+
if i < 2 {
162+
return 1
163+
}
164+
if f[i] != 0 {
165+
return f[i]
166+
}
167+
for l := 0; l < i; l += 2 {
168+
r := i - l - 2
169+
f[i] = (f[i] + dfs(l)*dfs(r)) % mod
170+
}
171+
return f[i]
172+
}
173+
return dfs(numPeople)
174+
}
175+
```
74176

177+
### **TypeScript**
178+
179+
```ts
180+
function numberOfWays(numPeople: number): number {
181+
const mod = 10 ** 9 + 7;
182+
const f: number[] = Array(numPeople + 1).fill(0);
183+
const dfs = (i: number): number => {
184+
if (i < 2) {
185+
return 1;
186+
}
187+
if (f[i] !== 0) {
188+
return f[i];
189+
}
190+
for (let l = 0; l < i; l += 2) {
191+
const r = i - l - 2;
192+
f[i] += Number((BigInt(dfs(l)) * BigInt(dfs(r))) % BigInt(mod));
193+
f[i] %= mod;
194+
}
195+
return f[i];
196+
};
197+
return dfs(numPeople);
198+
}
75199
```
76200

77201
### **...**

0 commit comments

Comments
 (0)