Skip to content

Commit c9aa923

Browse files
committed
feat: add solutions to lc problem: No.0650
No.0650.2 Keys Keyboard
1 parent f662a87 commit c9aa923

File tree

5 files changed

+474
-0
lines changed

5 files changed

+474
-0
lines changed

solution/0600-0699/0650.2 Keys Keyboard/README.md

+215
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,237 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:记忆化搜索**
52+
53+
定义 $dfs(i)$ 为输出 $i$ 个字符的最少操作次数。初始化 `dfs(1)=0`
54+
55+
当 $i\gt 1$ 时,有:
56+
57+
$$
58+
dfs(i)=\min _{j \mid i} (dfs(\frac{i}{j})+j, i), 2\leq j\lt i
59+
$$
60+
61+
时间复杂度 $O(n\sqrt{n})$。
62+
63+
**方法二:动态规划**
64+
65+
记忆化搜索也可以改成动态规划。
66+
67+
$$
68+
dp[i]=\min _{j \mid i} (dp[\frac{i}{j}]+j, i), 2\leq j\lt i
69+
$$
70+
71+
时间复杂度 $O(n\sqrt{n})$。
72+
5173
<!-- tabs:start -->
5274

5375
### **Python3**
5476

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

5779
```python
80+
class Solution:
81+
def minSteps(self, n: int) -> int:
82+
@cache
83+
def dfs(n):
84+
if n == 1:
85+
return 0
86+
i, ans = 2, n
87+
while i * i <= n:
88+
if n % i == 0:
89+
ans = min(ans, dfs(n // i) + i)
90+
i += 1
91+
return ans
5892

93+
return dfs(n)
94+
```
95+
96+
```python
97+
class Solution:
98+
def minSteps(self, n: int) -> int:
99+
dp = list(range(n + 1))
100+
dp[1] = 0
101+
for i in range(2, n + 1):
102+
j = 2
103+
while j * j <= i:
104+
if i % j == 0:
105+
dp[i] = min(dp[i], dp[i // j] + j)
106+
j += 1
107+
return dp[-1]
59108
```
60109

61110
### **Java**
62111

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

65114
```java
115+
class Solution {
116+
private int[] f;
117+
118+
public int minSteps(int n) {
119+
f = new int[n + 1];
120+
Arrays.fill(f, -1);
121+
return dfs(n);
122+
}
123+
124+
private int dfs(int n) {
125+
if (n == 1) {
126+
return 0;
127+
}
128+
if (f[n] != -1) {
129+
return f[n];
130+
}
131+
int ans = n;
132+
for (int i = 2; i * i <= n; ++i) {
133+
if (n % i == 0) {
134+
ans = Math.min(ans, dfs(n / i) + i);
135+
}
136+
}
137+
f[n] = ans;
138+
return ans;
139+
}
140+
}
141+
```
142+
143+
```java
144+
class Solution {
145+
public int minSteps(int n) {
146+
int[] dp = new int[n + 1];
147+
for (int i = 0; i < n + 1; ++i) {
148+
dp[i] = i;
149+
}
150+
dp[1] = 0;
151+
for (int i = 2; i < n + 1; ++i) {
152+
for (int j = 2; j * j <= i; ++j) {
153+
if (i % j == 0) {
154+
dp[i] = Math.min(dp[i], dp[i / j] + j);
155+
}
156+
}
157+
}
158+
return dp[n];
159+
}
160+
}
161+
```
162+
163+
```java
164+
class Solution {
165+
public int minSteps(int n) {
166+
int res = 0;
167+
for (int i = 2; n > 1; ++i) {
168+
while (n % i == 0) {
169+
res += i;
170+
n /= i;
171+
}
172+
}
173+
return res;
174+
}
175+
}
176+
```
177+
178+
### **C++**
179+
180+
```cpp
181+
class Solution {
182+
public:
183+
vector<int> f;
184+
185+
int minSteps(int n) {
186+
f.assign(n + 1, -1);
187+
return dfs(n);
188+
}
189+
190+
int dfs(int n) {
191+
if (n == 1) return 0;
192+
if (f[n] != -1) return f[n];
193+
int ans = n;
194+
for (int i = 2; i * i <= n; ++i) {
195+
if (n % i == 0) {
196+
ans = min(ans, dfs(n / i) + i);
197+
}
198+
}
199+
f[n] = ans;
200+
return ans;
201+
}
202+
};
203+
```
204+
205+
```cpp
206+
class Solution {
207+
public:
208+
int minSteps(int n) {
209+
vector<int> dp(n + 1);
210+
iota(dp.begin(), dp.end(), 0);
211+
dp[1] = 0;
212+
for (int i = 2; i < n + 1; ++i) {
213+
for (int j = 2; j * j <= i; ++j) {
214+
if (i % j == 0) {
215+
dp[i] = min(dp[i], dp[i / j] + j);
216+
}
217+
}
218+
}
219+
return dp[n];
220+
}
221+
};
222+
```
223+
224+
### **Go**
225+
226+
```go
227+
func minSteps(n int) int {
228+
f := make([]int, n+1)
229+
for i := range f {
230+
f[i] = -1
231+
}
232+
var dfs func(int) int
233+
dfs = func(n int) int {
234+
if n == 1 {
235+
return 0
236+
}
237+
if f[n] != -1 {
238+
return f[n]
239+
}
240+
ans := n
241+
for i := 2; i*i <= n; i++ {
242+
if n%i == 0 {
243+
ans = min(ans, dfs(n/i)+i)
244+
}
245+
}
246+
return ans
247+
}
248+
return dfs(n)
249+
}
250+
251+
func min(a, b int) int {
252+
if a < b {
253+
return a
254+
}
255+
return b
256+
}
257+
```
258+
259+
```go
260+
func minSteps(n int) int {
261+
dp := make([]int, n+1)
262+
for i := range dp {
263+
dp[i] = i
264+
}
265+
dp[1] = 0
266+
for i := 2; i < n+1; i++ {
267+
for j := 2; j*j <= i; j++ {
268+
if i%j == 0 {
269+
dp[i] = min(dp[i], dp[i/j]+j)
270+
}
271+
}
272+
}
273+
return dp[n]
274+
}
66275

276+
func min(a, b int) int {
277+
if a < b {
278+
return a
279+
}
280+
return b
281+
}
67282
```
68283

69284
### **...**

0 commit comments

Comments
 (0)