【发布时间】:2018-12-29 20:20:55
【问题描述】:
我在一次采访中遇到了这个问题 - 以最少的操作数将数字源转换为目标。
允许的操作
- 乘以 2。
- 加1。
- 减1。
0
我尝试了天真的递归路线(O(3 ^ n)),即。在每个级别减 1,加 1 并乘以 2,以尝试找到可以扩展到动态编程但由于无限循环而无法扩展的解决方案。
//Naive approach Via Recursion
int minMoves(int source, int target){
if(source <1 || source > target){
return -1;
}
int moves =0;
// Potential infinite loop - consider 3,6-> 2,6- >1,6->(0,6)x (2,6)->1,6->(0,6)x (1,6)->(0,6)x (2,6)->1,6..
int movesLeft = minMoves(source -1, target) ==-1? Integer.MAX_VALUE:minMoves(source -1, target);
int movesRight = minMoves(source +1, target) ==-1? Integer.MAX_VALUE:minMoves(source +1, target);
int moves2X = minMoves(2*source, target) ==-1? Integer.MAX_VALUE:minMoves(2*source, target);
moves = 1+ Math.min(Math.min(movesRight,movesLeft), moves2X);
return moves;
}
关于如何调整我的解决方案的任何想法?或者可能有更好的方法来解决它?
【问题讨论】:
-
递归代码有效吗?
-
它没有,我在代码中有一个示例,我认为它通过进入无限循环而失败。
标签: algorithm language-agnostic dynamic-programming