一. 概念定义
1.1 组合数定义
组合数在数学中表示为C(n,m),它的实际含义是:从n个不一样的元素中,选择 m 个元素的方案数。
1.2 组合数递推公式
组合数递推公式如下:
二. 推荐专栏
三. 相关练习
3.1 杨辉三角
同过分析,我们很容易的得出,杨辉三角可以用一个矩阵(二维数组)dp[ i ][ j ]表示,同时他还准许这样一个状态方程dp[ i ][ j ] = dp[i - 1][j - 1] + dp[i - 1][ j ]。
代码如下:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
int** ret = (int*)malloc(sizeof(int*) * numRows);
*returnSize = numRows;
*returnColumnSizes =(int*) malloc(sizeof(int) * numRows);
for(int i = 0; i < numRows; i++){
ret[i] = malloc(sizeof(int) * (i + 1));
(*returnColumnSizes)[i] = i + 1;
ret[i][0] = ret[i][i] = 1;
for (int j = 1; j < i; ++j) {
ret[i][j] = ret[i - 1][j] + ret[i - 1][j - 1];
}
}
return ret;
}
3.2 杨辉三角 II
这道题做法和上道题一样,不过我们不许要返回所有,只需返回指定的那一行即可
代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* getRow(int rowIndex, int* returnSize){
*returnSize = rowIndex + 1;
int** dp = (int**)malloc(sizeof(int*) * (rowIndex + 1));
for(int i = 0; i <= rowIndex; i++){
dp[i] = (int*)malloc(sizeof(int) * (i + 1));
for(int j = 0; j <= i; j++){
if(j == 0 || j == i){
dp[i][j] = 1;
}
else{
dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
}
}
}
return dp[rowIndex];
}