【发布时间】:2020-08-29 23:52:09
【问题描述】:
最近我偶然发现了一种称为 2 Keys Keyboard 的算法。问题陈述如下:
最初在记事本上只有一个字符“A”。对于每个步骤,您可以在此记事本上执行两个操作:
全部复制:您可以复制记事本上的所有字符(不允许部分复制)。 粘贴:可以粘贴上次复制的字符。
给定一个数字 n。您必须通过执行允许的最小步骤数在记事本上准确地获得 n 'A'。输出得到 n 'A' 的最小步数。
示例 1:
输入:3 输出:3 解释: 最初,我们有一个字符“A”。 在步骤 1 中,我们使用 Copy All 操作。 在第 2 步中,我们使用粘贴操作来获取“AA”。 在第 3 步中,我们使用粘贴操作来获取 'AAA'。
注意:
n 将在 [1, 1000] 范围内。
来源:Leetcode.com:https://leetcode.com/problems/2-keys-keyboard/
我想出了一个可以正常工作的递归解决方案。但是我对它的运行时感到困惑。这是我的递归算法:
class Solution {
public int minSteps(int n) {
if(n == 1){
return 0;
}
return recursiveDriver(1, 1, n, 1);
}
public int recursiveDriver(int currCount, int totalOperationsSoFar, int target, int previousCopy){
if(currCount == target){
return totalOperationsSoFar;
}
if(currCount > target || previousCopy > target){
return Integer.MAX_VALUE;
}
int countAfterAddingPreviousCopy = currCount+previousCopy;
int previousCopyVersion = recursiveDriver(countAfterAddingPreviousCopy, totalOperationsSoFar+1, target, previousCopy);
int pastePreviousAndCopyVersion = recursiveDriver(countAfterAddingPreviousCopy, totalOperationsSoFar+2, target, countAfterAddingPreviousCopy);
int minNeeded = Integer.min(previousCopyVersion, pastePreviousAndCopyVersion);
return minNeeded;
}
}
我认为运行时间会是 O(2^n),但在最坏的情况下会是多少?
【问题讨论】: