【发布时间】:2015-02-28 14:18:36
【问题描述】:
我有一个简单的递归解决方案如下:
public int countPaths(int x, int y) {
if(x == 0 && y == 0) {
return 0;
} else if(x == 0) {
return 1;
} else if(y == 0) {
return 1;
} else {
int count = countPaths(x-1, y);
count += countPaths(x, y-1);
return count;
}
}
这是为了解决书中的以下问题:Cracking the coding interview
想象一个机器人坐在 X x Y 网格的左上角。机器人只能在两个方向上移动:向右和向下。机器人从 (0,0) 到 (X,Y) 有多少条可能的路径?
我正在尝试确定运行时间复杂度,我相信它是 O(x+y)。我通过使用递归树来达到这个目的,例如如果 x=2 和 y=2
这棵树的最大深度是 (x+y),每一步所做的功是一个常数。所以完成的最大工作是 (x+y) * c,因此运行时间复杂度是 O(x+y)
问题 1:我说的对吗?我认为我计算的上限不够紧
问题 2:接下来,如果我要使用记忆化改进运行时间,因此不重复计算子问题,那么 Big-o 描述的运行时间复杂度将如何变化? p>
【问题讨论】:
标签: java algorithm recursion runtime big-o