1.斐波那契数
题目链接:
509. 斐波那契数
分析:
这道题的初始条件为f(0) = 0,f(1) = 1,后面的数字是其前面两个数字的和,例如f(2) = f(0) + f(1) = 1。所以我们要直到f(n),首先就得知道f(n - 1) 和 f(n - 2)
代码如下:
int fib(int n){
if(n == 0){
return 0;
}
if(n == 1 || n == 2){
return 1;
}
return fib(n - 1) + fib(n - 2);
}
2. 第 N 个泰波那契数
题目链接:
1137. 第 N 个泰波那契数
分析:
这道题和斐波那契数列差不多,就是由n > 3,f(n) = f(n - 1) + f(n - 2) + f(n - 3)
代码如下:
int tribonacci(int n){
int t0 = 0, t1 = 1, t2 = 1;
int num = 0;
if(n == 0)return 0;
if(n == 1 || n == 2)return 1;
for(int i = 3; i <= n; i++){
num = t0 + t1 + t2;
t0 = t1;
t1 = t2;
t2 = num;
}
return num;
}
3. 杨辉三角
题目链接:
118. 杨辉三角
分析:
这道题也是一道典型的动态规划问题,我们可以定义一个二维数组dp,初始条件为dp[0][0] = dp[1][0] = dp[1][1] = 1,后面的值都是由状态方程dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]得到的。
代码如下:
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;
}
4. 杨辉三角 II
题目链接:
119. 杨辉三角 II
这道题和上题一样,不过不需要将整个返回,只需计算出第rowIndex行的数据,将其返回即可。
代码如下:
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];
}
5. 爬楼梯
题目链接:
70. 爬楼梯
这道题就是一道斐波那契题,数学分析大家可以看该题解:
爬楼梯分析
代码如下:
int climbStairs(int n){
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
int a = 1, b = 2;
int sum = 0;
for(int i = 3; i <= n; i++){
sum = a + b;
a = b;
b = sum;
}
return sum;
}
6. 圆圈中最后剩下的数字
题目链接:
剑指 Offer 62. 圆圈中最后剩下的数字
题解链接:
数学 + 递归
代码如下:
int lastRemaining(int n, int m){
int f = 0;
for(int i = 2; i != n + 1; i++){
f = (m + f) % i;
}
return f;
}