leetcode 650. 只有两个键的键盘

199 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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)。