与下面的函数一样,如何计算其时间复杂度?我认为应该是O(m * n)......
int uniquePaths(int m, int n) {
if (m < 1 || n < 1) return 0;
if (m == 1 && n == 1) return 1;
return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
}
答案 0 :(得分:2)
您可以使用递归函数T(m,n) = T(m-1, n) + T(m, n-1)
建模时间复杂度,T(1,1)=1
和T(m,n)=0
只要min(m,n)<1
。
看起来像T(m,n)=(m+n choose m)
。要查看此注释,recurrence for the binomial coefficients (m+n choose n) = (m+n-1 choose m) + (m+n-1 choose m-1)
以及T(m,n) = T(m-1, n) + T(m,n-1)
完全相同。
因此T(m,n) = O((m+n)^n / n!)
。 (有many other bounds。)
答案 1 :(得分:1)
要表示m = M且n = N的问题,请将其写为 <M, N>
。如果我们尝试绘制此问题的递归树:
<M, N>
<M-1, N>
和 <M, N-1>
<0, 0>
。但是,这棵树的最大深度是多少?它的 1 (M + N)。此外,每个节点<M, N>
最多可以分为2个路径,即。 <M-1, N>
和<M, N-1>
。
那么,可能的最大叶数是多少? (提示:2 (M + N))
好吧,因为每个节点都会断开两个节点,所以每个级别的叶子数量都会乘以2,从根节点开始。
因此,算法的复杂性可以上限为 O(2 (m + n))。
1 最长的路径将从<M, N>
开始,首先转到<0, N>
。然后从那里开始<0, 0>
。因此,最长的路径长度= M + N.