自己做
解:公式计算(溢出处理)
cpp
复制代码
class Solution {
public:
int uniquePaths(int m, int n) {
int res = 1;
bool is_all_div = false; //标记n - 1的阶乘是否全部被除了
vector<bool> div(n - 2, false); //标记除数(从2到n - 1,除以1没有意义,这里省略)
for(int i = m; i < n + m - 1; i++){
int number = i;
//应除尽除【这里是为了防止多个乘数溢出的情况,那么在乘之前就先尽可能和除数相除】
for(int j = n - 3; j >= 0; j--){
if(!div[j] && number % (j + 2) == 0){ //发现有可以整除的除数
number /= (j + 2);
div[j] = true; //标记该数已经取过
}
}
res *= number;
//应除尽除【经过上面的计算,除数不一定能被完全除玩,因为可能存在上一个余数是2,下一个余数是3,而始终没有一个乘数可以和除数6整除,但事实上,2*3就可以被6整除,而2*3的存放地方就是结果res这里】
for(int j = n - 3; j >= 0; j--){
if(!div[j] && res % (j + 2) == 0){ //发现有可以整除的除数
res /= (j + 2);
div[j] = true; //标记该数已经取过
}
}
}
return res;
}
};