Skip to content

Commit 3f60675

Browse files
committed
feat: add solutions to lc problem: No.0818
No.0818.Race Car
1 parent 888ba06 commit 3f60675

File tree

7 files changed

+237
-3
lines changed

7 files changed

+237
-3
lines changed

solution/0800-0899/0818.Race Car/README.md

+89-1
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,110 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:动态规划**
65+
66+
设 $dp[i]$ 表示到达位置 $i$ 的最短指令序列的长度。答案为 $dp[target]$。
67+
68+
对于任意位置 $i$,都有 $2^{k-1} \leq i \lt 2^k$,并且我们可以有三种方式到达位置 $i$:
69+
70+
- 如果 $i$ 等于 $2^k-1$,那么我们可以直接执行 $k$ 个 `A` 指令到达位置 $i$,此时 $dp[i] = k$;
71+
- 否则,我们可以先执行 $k$ 个 `A` 指令到达位置 $2^k-1$,然后执行 `R` 指令,剩余距离为 $2^k-1-i$,此时 $dp[i] = dp[2^k-1-i] + k + 1$;我们也可以先执行 $k-1$ 个 `A` 指令到达位置 $2^{k-1}-1$,然后执行 `R` 指令,接着执行 $j$(其中 $0 \le j \lt k$) 个 `A`,再执行 `R`,剩余距离为 $i - 2^{k-1} + 2^j$,此时 $dp[i] = dp[i - 2^{k-1} + 2^j] + k - 1 + j + 2$。求出 $dp[i]$ 的最小值即可。
72+
73+
时间复杂度 $O(n \log n)$,其中 $n$ 为 $target$。
74+
6475
<!-- tabs:start -->
6576

6677
### **Python3**
6778

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

7081
```python
71-
82+
class Solution:
83+
def racecar(self, target: int) -> int:
84+
dp = [0] * (target + 1)
85+
for i in range(1, target + 1):
86+
k = i.bit_length()
87+
if i == 2**k - 1:
88+
dp[i] = k
89+
continue
90+
dp[i] = dp[2**k - 1 - i] + k + 1
91+
for j in range(k - 1):
92+
dp[i] = min(dp[i], dp[i - (2 ** (k - 1) - 2**j)] + k - 1 + j + 2)
93+
return dp[target]
7294
```
7395

7496
### **Java**
7597

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

78100
```java
101+
class Solution {
102+
public int racecar(int target) {
103+
int[] dp = new int[target + 1];
104+
for (int i = 1; i <= target; ++i) {
105+
int k = 32 - Integer.numberOfLeadingZeros(i);
106+
if (i == (1 << k) - 1) {
107+
dp[i] = k;
108+
continue;
109+
}
110+
dp[i] = dp[(1 << k) - 1 - i] + k + 1;
111+
for (int j = 0; j < k; ++j) {
112+
dp[i] = Math.min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2);
113+
}
114+
}
115+
return dp[target];
116+
}
117+
}
118+
```
119+
120+
### **C++**
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
int racecar(int target) {
126+
vector<int> dp(target + 1);
127+
for (int i = 1; i <= target; ++i) {
128+
int k = 32 - __builtin_clz(i);
129+
if (i == (1 << k) - 1) {
130+
dp[i] = k;
131+
continue;
132+
}
133+
dp[i] = dp[(1 << k) - 1 - i] + k + 1;
134+
for (int j = 0; j < k; ++j) {
135+
dp[i] = min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2);
136+
}
137+
}
138+
return dp[target];
139+
}
140+
};
141+
```
79142
143+
### **Go**
144+
145+
```go
146+
func racecar(target int) int {
147+
dp := make([]int, target+1)
148+
for i := 1; i <= target; i++ {
149+
k := bits.Len(uint(i))
150+
if i == (1<<k)-1 {
151+
dp[i] = k
152+
continue
153+
}
154+
dp[i] = dp[(1<<k)-1-i] + k + 1
155+
for j := 0; j < k; j++ {
156+
dp[i] = min(dp[i], dp[i-(1<<(k-1))+(1<<j)]+k-1+j+2)
157+
}
158+
}
159+
return dp[target]
160+
}
161+
162+
func min(a, b int) int {
163+
if a < b {
164+
return a
165+
}
166+
return b
167+
}
80168
```
81169

82170
### **...**

solution/0800-0899/0818.Race Car/README_EN.md

+78-1
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,90 @@ Your position goes from 0 --&gt; 1 --&gt; 3 --&gt; 7 --&gt; 7 --&gt; 6.
6060
### **Python3**
6161

6262
```python
63-
63+
class Solution:
64+
def racecar(self, target: int) -> int:
65+
dp = [0] * (target + 1)
66+
for i in range(1, target + 1):
67+
k = i.bit_length()
68+
if i == 2**k - 1:
69+
dp[i] = k
70+
continue
71+
dp[i] = dp[2**k - 1 - i] + k + 1
72+
for j in range(k - 1):
73+
dp[i] = min(dp[i], dp[i - (2 ** (k - 1) - 2**j)] + k - 1 + j + 2)
74+
return dp[target]
6475
```
6576

6677
### **Java**
6778

6879
```java
80+
class Solution {
81+
public int racecar(int target) {
82+
int[] dp = new int[target + 1];
83+
for (int i = 1; i <= target; ++i) {
84+
int k = 32 - Integer.numberOfLeadingZeros(i);
85+
if (i == (1 << k) - 1) {
86+
dp[i] = k;
87+
continue;
88+
}
89+
dp[i] = dp[(1 << k) - 1 - i] + k + 1;
90+
for (int j = 0; j < k; ++j) {
91+
dp[i] = Math.min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2);
92+
}
93+
}
94+
return dp[target];
95+
}
96+
}
97+
```
98+
99+
### **C++**
100+
101+
```cpp
102+
class Solution {
103+
public:
104+
int racecar(int target) {
105+
vector<int> dp(target + 1);
106+
for (int i = 1; i <= target; ++i) {
107+
int k = 32 - __builtin_clz(i);
108+
if (i == (1 << k) - 1) {
109+
dp[i] = k;
110+
continue;
111+
}
112+
dp[i] = dp[(1 << k) - 1 - i] + k + 1;
113+
for (int j = 0; j < k; ++j) {
114+
dp[i] = min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2);
115+
}
116+
}
117+
return dp[target];
118+
}
119+
};
120+
```
69121
122+
### **Go**
123+
124+
```go
125+
func racecar(target int) int {
126+
dp := make([]int, target+1)
127+
for i := 1; i <= target; i++ {
128+
k := bits.Len(uint(i))
129+
if i == (1<<k)-1 {
130+
dp[i] = k
131+
continue
132+
}
133+
dp[i] = dp[(1<<k)-1-i] + k + 1
134+
for j := 0; j < k; j++ {
135+
dp[i] = min(dp[i], dp[i-(1<<(k-1))+(1<<j)]+k-1+j+2)
136+
}
137+
}
138+
return dp[target]
139+
}
140+
141+
func min(a, b int) int {
142+
if a < b {
143+
return a
144+
}
145+
return b
146+
}
70147
```
71148

72149
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public:
3+
int racecar(int target) {
4+
vector<int> dp(target + 1);
5+
for (int i = 1; i <= target; ++i) {
6+
int k = 32 - __builtin_clz(i);
7+
if (i == (1 << k) - 1) {
8+
dp[i] = k;
9+
continue;
10+
}
11+
dp[i] = dp[(1 << k) - 1 - i] + k + 1;
12+
for (int j = 0; j < k; ++j) {
13+
dp[i] = min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2);
14+
}
15+
}
16+
return dp[target];
17+
}
18+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
func racecar(target int) int {
2+
dp := make([]int, target+1)
3+
for i := 1; i <= target; i++ {
4+
k := bits.Len(uint(i))
5+
if i == (1<<k)-1 {
6+
dp[i] = k
7+
continue
8+
}
9+
dp[i] = dp[(1<<k)-1-i] + k + 1
10+
for j := 0; j < k; j++ {
11+
dp[i] = min(dp[i], dp[i-(1<<(k-1))+(1<<j)]+k-1+j+2)
12+
}
13+
}
14+
return dp[target]
15+
}
16+
17+
func min(a, b int) int {
18+
if a < b {
19+
return a
20+
}
21+
return b
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public int racecar(int target) {
3+
int[] dp = new int[target + 1];
4+
for (int i = 1; i <= target; ++i) {
5+
int k = 32 - Integer.numberOfLeadingZeros(i);
6+
if (i == (1 << k) - 1) {
7+
dp[i] = k;
8+
continue;
9+
}
10+
dp[i] = dp[(1 << k) - 1 - i] + k + 1;
11+
for (int j = 0; j < k; ++j) {
12+
dp[i] = Math.min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2);
13+
}
14+
}
15+
return dp[target];
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def racecar(self, target: int) -> int:
3+
dp = [0] * (target + 1)
4+
for i in range(1, target + 1):
5+
k = i.bit_length()
6+
if i == 2**k - 1:
7+
dp[i] = k
8+
continue
9+
dp[i] = dp[2**k - 1 - i] + k + 1
10+
for j in range(k - 1):
11+
dp[i] = min(dp[i], dp[i - (2 ** (k - 1) - 2**j)] + k - 1 + j + 2)
12+
return dp[target]

solution/1100-1199/1147.Longest Chunked Palindrome Decomposition/Solution.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ def longestDecomposition(self, text: str) -> int:
55
return n
66
for i in range(n // 2 + 1):
77
if text[:i] == text[-i:]:
8-
return 2 + self.longestDecomposition(text[i: -i])
8+
return 2 + self.longestDecomposition(text[i:-i])
99
return 1

0 commit comments

Comments
 (0)