题目:https://leetcode.com/problems/unique-paths/
典型思路是用dp来解,时间,空间均为O(n):
public int uniquePaths(int m, int n) {
int[] ans = new int[n];
Arrays.fill(ans,1);
for(int i=1;i<m;++i){
for(int j=1;j<n;++j){
ans[j] += ans[j-1];
}
}
return ans[n-1];
}
但是可用更直接的数学方法来看:设往下为1,往右为0,则本题转化为求m-1个1和n-1个0的排列个数,所以答案是C(m-1,m+n-2). 代码如下:
//Combinatorics C(m-1,m+n-2)
import java.util.*;
class Solution {
public int uniquePaths(int m, int n) {
return (int)combination(m-1,m+n-2);
}
long combination(int m,int sum){
m = Math.min(sum-m,m);
long ans = 1;
for(int i=0;i<m;i++) {
ans *= sum-i;
ans /= 1+i;
}
return ans;
}
}