leetcode 62 不同的路径
描述:
m*n的矩阵,从左上角走到右下角,只能向下或向右走。
解决:
简单dp,dp[i][j]表示到i,j这点总共多少种路径。
dp[i][j] = dp[i][j - 1] + dp[i - 1][j],化为一维:
int uniquePaths(int m, int n) { int* arr = new int[m](); for (int i = 0; i < m; ++i) // 初始化 arr[i] = 1; for (int i = 1; i < n; ++i) { for (int j = 0; j < m; ++j) { if (j == 0) arr[0] = 1; arr[j] = arr[j - 1] + arr[j]; } } return arr[m - 1]; }
注意,1*1的化结果是1的,如果别的题目是0,初始化里i改为从1开始即可。
也可以用数学点的方法解决,m*n的矩阵,假设m是行,则无论怎么走总会向下走m步,向右走n步,
即从m+n中选m个点,剩下为n,即C(m, m+n),组合,朴素解法:
int uniquePaths(int m, int n) { int sum = m + n - 2; int c = min(m - 1, n - 1); long ret = 1; long chu = 1; for (int i = 0; i < c; ++i) ret *= sum--; for (int i = 1; i <= c; ++i) chu *= i; return ret/chu; }
在leetcode可以过,但有快速计算组合数的算法。
dp复杂度:O(m*n)
算组合数复杂度:不大于O(m!),这只是大概的数量级,还有logm的求法。
注意:实际100的阶乘非常大,大于long类型最大值。
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】
浙公网安备 33010602011771号