这是Coursera上的算法工具箱课程中的一个问题。问题描述如下:
您将获得一个原始计算器,可以使用当前数字执行以下三个操作 x:将x乘以2,将x乘以3,或将x加1。你的目标给出一个正整数n,找到 从数字1开始获取数字n所需的最小操作次数。
我实现了一个递归解决方案并使用了memoization,并设法解决了一些测试用例,但我一直在失败(他们不告诉我哪个输入失败了)。
这是我的解决方案: https://codeshare.io/aYWoPL
我不知道,为什么我的代码没有像预期的那样工作。我不希望你给我代码,如果我愿意的话,我可以在网上找到它,我只是想知道为什么我的代码不能正常工作!提前谢谢。
我搜索了之前的问题,但没有找到令人满意的解决方案,很抱歉,如果这对你们中的某些人来说是重复的。
答案 0 :(得分:0)
不确定为什么你有特殊情况n == 10
,还有重复的陈述。但真正重要的错误是else if
的使用 - 数字可以是 3
和2
的倍数。您需要在所有三个操作中采取所需的最少步骤:
long long numOp (int n, long long num_operations[]) {
if (n <= 1) return 0;
if (num_operations[n - 2] > 0)
return num_operations[n - 2];
long long min = numOp(n - 1, num_operations);
if (n % 3 == 0) {
long long temp = numOp(n / 3, num_operations);
if (temp < min) min = temp;
}
if (n % 2 == 0) {
long long temp = numOp(n / 2, num_operations);
if (temp < min) min = temp;
}
return (num_operations[n - 2] = 1 + min);
}