小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
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
解题思路
每次将连续的字符串A分解,如果是二的倍数就是最优的,因为只需要复制粘贴两步,如果是3的倍数,就需要复制粘贴粘贴三步。因此,我们需要将字符串分解成为尽量大的几部分,所以我们可以从2,3,4...一直查找当前字符串能被分割为几块.因此我们只需要使用「试除法」,对 n 进行质因数分解,并且统计出所有质因数的和,即为最终的答案。
代码
class Solution {
public int minSteps(int n) {
int res=0;
while(n>1)
{
for(int i=2;i<=n;i++)
if(n%i==0)
{
n/=i;
res+=i;
break;
}
}
return res;
}
}
- 时间复杂度:O(sqrt(n),即为质因数分解的时间复杂度。
- 空间复杂度:O(1)。