空间复杂度:O(mn),即为存储所有状态需要的空间。注意到 f(i, j)仅与第 i 行和第 i-1 行的状态有关,因此我们可以使用滚动数组代替代码中的二维数组,使空间复杂度降低为 O(n)。此外,由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得 m≤n,这样空间复杂度降低至 O(min(m,n))。
classSolution { public: intuniquePaths(int m, int n){ longlong ans = 1; for (int x = n, y = 1; y < m; ++x, ++y) { ans = ans * x / y; } return ans; } };
Java代码
1 2 3 4 5 6 7 8 9
classSolution{ publicintuniquePaths(int m, int n){ long ans = 1; for (int x = n, y = 1; y < m; ++x, ++y) { ans = ans * x / y; } return (int) ans; } }
Python3代码
1 2 3
classSolution: defuniquePaths(self, m: int, n: int) -> int: return comb(m + n - 2, n - 1)
复杂度分析
时间复杂度:O(min(m,n))。由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得 m≤n,这样空间复杂度降低至 O(min(m,n))。