此题是数学中的组合题,直接运用组合进行求解即可。需要注意的是求解组合的方法,不能直接使用阶乘,否则大数的阶乘会超过 int 和 long 的存储范围导致错误。
还有一点需要额外注意:题目中说 m 和 n 最多只有 100,但是如果 m 和 n 是 100 的话,结果是 22750883079422934966181954039568885395604168260154104734000,这远远超出 int 的存储范围,但是题目中给出的函数返回值是 int 类型,所以此处假设,输入的值计算得到的结果不会超过 int 类型的存储范围。
classSolution { /** * 计算组合C(n,m) * @param n 组合的下标 * @param m 组合的上标 * @return n!/m!(n-m)! */ privateintcalcCombination(int n, int m) { if (m <= 0) { return1; } // 如果 m 值太大,利用 C(n, m) = C(n, n - m)的关系,将 m 值降下来 // 既可以避免多次计算,也可以避免计算结果太大无法存储 if (m * 2 > n) { m = n - m; } // 为了使计算结果能够存储,此处用 long 类型而不是 int 类型 longa= n; longb=1; for (inti=1; i < m; i++) { a *= n - i; b *= i + 1; if (a % b == 0) { a = a / b; b = 1; } }
return (int) (a / b); } publicintuniquePaths(int m, int n) { // 确保 C(n, m) 中,n 比 m 大 if (m > n) { inttemp= m; m = n; n = temp; } return calcCombination(m + n - 2, m - 1); } }