LeetCode650-只有两个键的键盘

题目链接

英文链接:https://leetcode.com/problems/2-keys-keyboard/

中文链接:https://leetcode-cn.com/problems/2-keys-keyboard/

题目详述

最初在一个记事本上只有一个字符 ‘A’。你每次可以对这个记事本进行两种操作:

  1. Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。
  2. Paste (粘贴) : 你可以粘贴你上一次复制的字符。

给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 ‘A’。输出能够打印出 n 个 ‘A’ 的最少操作次数。

示例 1:

1
2
3
4
5
6
7
输入: 3
输出: 3
解释:
最初, 我们只有一个字符 'A'。
第 1 步, 我们使用 Copy All 操作。
第 2 步, 我们使用 Paste 操作来获得 'AA'。
第 3 步, 我们使用 Paste 操作来获得 'AAA'。

说明:

n 的取值范围是 [1, 1000] 。

题目详解

  • 花费 2 步(Copy All, Paste)变成 2 倍,花费 3 步(Copy All, Paste,Paste)变成 3 倍,……,依此类推。
  • f(n) 代表得到 n 个 ‘A’ 需要的操作次数。
  • 如果 n % 2 == 0,那么 f(n) = f(n / 2) + 2
  • 如果 n % 3 == 0,那么 f(n) = f(n / 3) + 3
  • 2 * 2 = 2 + 22 * 3 > 2 + 34 * 4 > 4 + 4,……。对于正整数 pq,当 p > 1, q > 1 时,可以得到 p + q <= pq,这是因为 (p - 1)(q - 1) >= 1,所以把 pq 分解成 p + q 会使最终结果变小。应该尽可能地把数进行分解,分解到不能再分,可以达到最少的操作次数。
  • 本题就转化为了求数 n 的所有质因子之和。
1
2
3
4
5
6
7
8
9
10
11
12
13
public class LeetCode_00650 {

public int minSteps(int n) {
int res = 0;
for (int i = 2; n > 1; ++i) {
while (n % i == 0) {
res += i;
n /= i;
}
}
return res;
}
}