刷题的时候在leetcode上碰到了一个求组合数的问题,很蠢地去用阶层求分子分母然后做除法,结果跑了一大半的用例之后就溢出了,于是了解到了有组合数公式的递推方法,公式如下
这是直接截的图,第一个范围n>=0是成立的,编程实现的时候,第二个范围注意了就OK
题目如下:
AC代码:
class Solution {
public:
vector<int> getRow(int rowIndex) {
vector<int> arr(rowIndex+1, 0);;
arr[0]=1;//保证左边第一个值为1,相当于C(n,0)
for(int i=1;i<=rowIndex;i++)//向右开始递归,C(i,x)就相当于公式中的C(n,k)
{
arr[i]=1;//相当于C(n,n)
//注意范围0<k<n,这里j就相当于k
for(int j=i-1;j>=1;j--)//使用滚动数组将空间复杂度降到O(n),每次递归用的上一次的值,注意要从后往前遍历,因为要用前面的值参与递归
arr[j]=arr[j-1]+arr[j];//C(n,k)=C(n-1,k-1)+C(n-1,k)
}
return arr;
}
};