650. 只有两个键的键盘
最初记事本上只有一个字符 'A'
。你每次可以对这个记事本进行两种操作:
Copy All
(复制全部):复制这个记事本中的所有字符(不允许仅复制部分字符)。Paste
(粘贴):粘贴 上一次 复制的字符。给你一个数字 n
,你需要使用最少的操作次数,在记事本上输出 恰好 n
个 'A'
。返回能够打印出 n
个 'A'
的最少操作次数。
示例 1:
输入:3 输出:3 解释: 最初, 只有一个字符 'A'。 第 1 步, 使用 Copy All 操作。 第 2 步, 使用 Paste 操作来获得 'AA'。 第 3 步, 使用 Paste 操作来获得 'AAA'。
示例 2:
输入:n = 1 输出:0
提示:
1 <= n <= 1000
原站题解
java 解法, 执行用时: 4 ms, 内存消耗: 38.8 MB, 提交时间: 2022-12-06 13:59:20
class Solution { public int minSteps(int n) { int[] f = new int[n + 1]; for (int i = 2; i <= n; ++i) { f[i] = Integer.MAX_VALUE; for (int j = 1; j * j <= i; ++j) { if (i % j == 0) { f[i] = Math.min(f[i], f[j] + i / j); f[i] = Math.min(f[i], f[i / j] + j); } } } return f[n]; } }
javascript 解法, 执行用时: 64 ms, 内存消耗: 42 MB, 提交时间: 2022-12-06 13:59:07
/** * @param {number} n * @return {number} */ var minSteps = function(n) { const f = new Array(n + 1).fill(0); for (let i = 2; i <= n; ++i) { f[i] = Number.MAX_SAFE_INTEGER; for (let j = 1; j * j <= i; ++j) { if (i % j === 0) { f[i] = Math.min(f[i], Math.floor(f[j] + i / j)); f[i] = Math.min(f[i], Math.floor(f[i / j] + j)); } } } return f[n]; };
golang 解法, 执行用时: 4 ms, 内存消耗: 2.2 MB, 提交时间: 2022-12-06 13:58:53
func minSteps(n int) int { f := make([]int, n+1) for i := 2; i <= n; i++ { f[i] = math.MaxInt32 for j := 1; j*j <= i; j++ { if i%j == 0 { f[i] = min(f[i], f[j]+i/j) f[i] = min(f[i], f[i/j]+j) } } } return f[n] } func min(a, b int) int { if a > b { return b } return a }
python3 解法, 执行用时: 136 ms, 内存消耗: 14.9 MB, 提交时间: 2022-12-06 13:58:37
class Solution: def minSteps(self, n: int) -> int: f = [0] * (n + 1) for i in range(2, n + 1): f[i] = float("inf") j = 1 while j * j <= i: if i % j == 0: f[i] = min(f[i], f[j] + i // j) f[i] = min(f[i], f[i // j] + j) j += 1 return f[n]
python3 解法, 执行用时: 36 ms, 内存消耗: 14.9 MB, 提交时间: 2022-12-06 13:57:42
class Solution: def minSteps(self, n: int) -> int: ans = 0 i = 2 while i * i <= n: while n % i == 0: n //= i ans += i i += 1 if n > 1: ans += n return ans
javascript 解法, 执行用时: 56 ms, 内存消耗: 41.1 MB, 提交时间: 2022-12-06 13:57:27
/** * @param {number} n * @return {number} */ var minSteps = function(n) { let ans = 0; for (let i = 2; i * i <= n; ++i) { while (n % i === 0) { n = Math.floor(n / i); ans += i; } } if (n > 1) { ans += n; } return ans; };
golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2022-12-06 13:57:13
func minSteps(n int) (ans int) { for i := 2; i*i <= n; i++ { for n%i == 0 { n /= i ans += i } } if n > 1 { ans += n } return }
java 解法, 执行用时: 0 ms, 内存消耗: 38.1 MB, 提交时间: 2022-12-06 13:57:00
class Solution { public int minSteps(int n) { int ans = 0; for (int i = 2; i * i <= n; ++i) { while (n % i == 0) { n /= i; ans += i; } } if (n > 1) { ans += n; } return ans; } }